Skip to main content

Full text of "Das Interface Age Systemhandbuch Zum Commodore 64 Und VC 20"

See other formats


GRRERBENNN 
va: WR 
Inieriage Age IT If 


Systemlhaneluch i j III 


= NN 


COMMoOLELE HA ua ea 


2 EEE 
a FE 
EIS! 
B£, SERIE 
SESERIETTETN 
Ral 2 Babel Fin ® SEX. 
..w KRISE 
IISTER 2 
TRIER Aa 
. PEN 
RR 
Michael Krau . 
” er x ei N <= 
IT q nn 
A » 
D 


DAS INTERFACE AGE SYSTEMHANDBUCH ZUM COMMODORE 64 UND VC-20 


Ralph Babel 


unter Mitarbeit von 


Michael Krause und Andreas Dripke 


Gesamtherstellung 


Unternehmensberatung Andreas Dripke 


Vertrieb 


INTERFACE AGE 
Verlagsgesellschaft 


VORWORT 


Die Nutzbarkeit eines Computers aus der Sicht des Program- 
mierers hängt in entscheidender Weise von der verfügbaren 
Dokumentation ab. Für effiziente Programmierung ist die 
genaue Kenntnis der internen Strukturen unerläßlich. 


In dem vorliegenden Werk wird das Betriebssystem des Commo- 
dore 64 unter Einbeziehung des VC-20 ausführlich und umfas- 
send dargelegt. Viele der in diesem Buch enthaltenen Infor- 
mationen dürften zum Zeitpunkt des Erscheinens nur wenigen 
Menschen auf der Erde bekannt sein. Sie finden hierin alle 
Daten, die für die Programmierung des Computers relevant 
sind. 


Alle in diesem Buch genannten fakten wurden sorgfältig 
recherchiert und äußerst sorgsam aufbereitet. 


Die Informationen sind sowohl für den BASIC- als auch für 
den Assembler-Programmierer geeignet. Dabei wird es für Sie 
oftmals unerläßlich sein, Abschnitte mehrmals zu lesen, um 
sie voll zu verstehen. Die Fülle an Daten - komprimiert in 
einem Handbuch - macht dies erforderlich. Hätten wir einen 
weiter ausschweifenden Stil gewählt und damit diesem Buch 
mindestens dreimal so viele Seiten gegeben, so wäre es prak- 
tisch unmöglich, Daten gezielt zu suchen und insbesondere zu 
finden. Das Systemhandbuch ist sowohl zum Durchlesen als 
auch als Nachschlagewerk geeignet. 


Bitte haben Sie Verständnis dafür, daß wir keine Fragen zur 
Programmierung beantworten können. Würden wir dies einmal 
anfangen, kämen wir sicherlich nicht mehr dazu, weitere 
Bücher für Sie zu schreiben. Wir freuen uns aber über Kritik 
und Anregungen von Ihnen und werden diese in einer weiteren 
Auflage des Werkes berücksichtigen. Und wenn Ihnen unser 
Buch gefällt, freuen wir uns natürlich über Ihre Empfehlung 
an Kollegen, Bekannte und Freunde. i 


Nun wollen wir Sie der faszinierenden Fülle an Daten über- 
lassen, die Ihnen dieses Buch zu bieten hat. Möge es Ihnen 
ein hilfreches Handbuch bei der Programmierung Ihres Compu- 
ters sein. 


Ralph Babel 
Michael Krause 
Andreas Dripke 


Babel, Ralph; Krause, Michael; Dripke, Andreas 
DAS INTERFACE AGE SYSTEMHANDBUCH ZUM COMMODORE 64 UND VC-20 


1. (1983) 
2. (1983) 


ISBN 3-88986-001-X 


Dieses Buch ist mit internationalem Copyright belegt. Alle 
Rechte vorbehalten. Kein Teil des Werkes darf in irgendeiner 
Form ohne schriftliche Genehmigung von Andreas Dripke 
reproduziert, übersetzt, verarbeitet, verbreitet oder 
veröffentlicht werden. 


Weder Autoren noch Verlag oder Händler übernehmen eine 
Gewähr dafür, daß das Werk frei von Fehlern ist. Für 
Schäden, die durch solche Fehler entstehen, insbesondere für 
Folgeschäden, wird keine Haftung übernommen. 


Die Veröffentlichung von Namen, Schaltungen, Programmen, 
Verfahren, Funktionsgruppen etc. in diesem Buch berechtigt 
nicht zu der Annahme, daß diese frei von Schutzrechten 
Dritter seien. 


Made in West Germany 


Copyright (C) 1983 by Unternehmensberatung Andreas Dripke 
Gesamtherstellung: Unternehmensberatung Andreas Dripke 


Distribution(BRD): INTERFACE AGE VERLAG GMBH, Vohburgerstr.] 
D-8000 München 21, Tel. (089) 5 80 67 02. 


Director Sales/Marketing: Issi Franckh 


International Distribution: COMPUTER BOOKBASE 
(DATA DYNAMICS TECHNOLOGY, USA) 
Div. of INTERFACE AGE Inc. 
16704 Marquardt Avenue 
Cerritos, CA 90701, U.S.A. 


Druck: Offsetdruck Georg Kapehl, Wiesbaden 


INHALTSVERZEICHNIS 


VOrWOTEN.G GN a aa ns een een 
InhalEsverzeichnzs zus. een 
1. BASIE=-Interpreter „ur: 
Interne Codierung der BASIC-Programme ..... ee 
Tabelle der BASIC-Befehle ......sceerereoeeeeenenn 
Binärarithmetik oo. ... o oe oe oe oo 08 v...—. 1. .:.—.0—© 0 eeov01e eo oo 0 08 0 0 
Darstellung von Fließkommazahlen ........erecer0.. 
Darstellung und Ablage von Variablen ............ 
Nicht-indizierte Variablentypen .......c.:.. 
Arrays oo. ....2—.>.0—0© ee vv. .:e ee. oe oo oe © oe... .“.a„...„.”a.n”.”eC"eeese oe. 
USR-Funktion . .. 0. 01 0 0 0 oo oo 0 _—. er ar era er 
steuercöde-Auflistung „cs sn 00er 000006 Rn 
Steuercodes in Listings ........ een 

2. Assembler .eo oe 0 0 0 0 90 90 98 90 0 0 0 98 08 8 8 HH HH Vf 8 oe oe... ...”e”.—.e7—e067. .». .ee.... 
Einführung in Assembler ............ enrese BERPTE 


4. 


Assembler/Disassembler .....ec:eeeeoneeeereennnn nn 
Assembler-Befehlsliste: „issue... 222 53 
Symbolische Befehlsliste ......cceceooeeneeeneenee 
Adressierungsarten „2.00 2. 0 aan 


Graphik und Farbe (VIC-II-Chip) ....c:.20.. EEE 
Bildschirmspeicher ....... ES RE ER EIER > 
karbspeicher. sis... er ERTL 
Zeichengenerator ...... na een 
Definition eigener Zeichen ......cc.ece.00e0.e 
Modus für erweitere Hintergrundfarben ...... 
Mehrfarbige Zeichen (Multicolor-Modus) ..... 
Hochauflösende Graphik (Hi Res) ....eecccrecnconee 
Standard Bit-Map-Modus .....sceeeneeeeeeenee 
Multicolor-Bit-Map-Modus .....cseecr0. Seas 
Sprites - MOB '"Movable Object Block" ....... ee 
Aufbau-eines SprTrites u... 4.,4220u2.0 0. a 
Multicolor-Sprites ........:.. ERIRITREERN a 
Prioritäten zu... 4404 ee ee EEE 
Kollısionen ser ar u 
Interrupt- und Graphik-Kontrolle .....vseccccceoe 
Screen Blanking ee ee ne ee ee 
Scerolling in Punktzeilen (Smooth ee ee 
Registerübersicht ......... eier lee ie 
Farben_des VIC-II-Chips ...o.vereeoneeeennnennn ne 
Pinbelegung des VIC-II-Chips ..... EST RT FR 
SPTILE=-ENtwuürfsblatl. us ss na 
Sprite-Generator-Programm ........ ELTERN 
Funke 1onstästen. „es: sr EEE 


>. 


10. 


Tonerzeugung (SID 6581 Chip) ........ es re 


Tongenerator (Frequenzberechnung) ......c.r.... a 
ADSR-Funktion sa... et a as EN en 
Wellenformen .......sc.0..0. el er ET ETE 
Tonerzeugung ........ EUER EIETIEEETN et 
Filter 4,.228%% EURER ETUI 
Tongeneratort 3 za. rer 

Hullküurve .,2. 5300004 ee FREE 

Oszillatorn „asus nenne ee er 
A/DeWändler 2. erh ER TRREN > 
Registerübersicht ....... ee ee 
Pinbelegung ss. a 


Ein/Ausgabe (I/D) .....c..0.2.. BESTEN ELRHENR es 


seriellen. Bus. 2:42. u 2 En an 
RS=232 Datentransfer +»... 0.20 a, 1 2 a 
EIA.:6526 Chip ass 
Portprogrammierung ........+.. see ers 
serieller.-Port>»22:uuuu anne ee 
Timer ons 
"Tine DEF Day" Clock. u. ren il 
Interrupt-Handling .....vc2creeeoreeenneeenne 
Registerübersicht ....... nee ee 
Anwendung im Commodore 64 .....cereeererene.e 
Pinbelegung .„.ccscoeesesecne..e ....00..+ EEE 
Control-Ports ..... DE er DENE 
Joystick zueuncnaaaeer ee 
Paddle 4.445 ee es 
Lightpen +»... 028. 0 een 
Datenspeicherung Cassette/Diskette .........c.... 
Cassette ..v.coococoeseenesen nee sennnene ea. 
Header ...o-oser00essseeenne IRRE 
Datentypen ...:csc..0 0000000... EEE 
Zusammenfügen von Programmen .......+. s 

Diskette ausser ae era ene 
Dverlay ........ ee reeiee 


Echtzeituhr (EIA TIock) san it 
Adaption von CBM-Programmen .....s.e.:. eek 


Speicheraufteilung .......... TESTER ITETTN 


Speicherübersicht ........osc0s00s..00% EEFLIERTE 
Memory Map .. oo oo0eooneee seen een ernennen ne 
CPU 6510 / Speicherverwaltung ......o.rercc0.. BR 
Prozessorport .„....ecceeeeeeocseeeonneene ae 
Banking ...<oeeeeueneeenn nennen nn een. 
Pinbelegung der CPU 6510 .....voerreeeeneenee 


ROM-LIStIiNG cr rer 
ROM-Listing Commodore 64 .....ceereerereneneenene 


Adressumrechnung für VC-20 ...c.erereeeeerenneenee 
Systemroutinen .....ccececeeenene ee ae 


Stichwortverzeichnis ....... a a a ee ee RER 


30C 


INTERNE CODIERUNG DER BASIC-PROGRAMME 


BASIC-Befehle werden, zur Einsparung von Speicherplatz und 
zur Beschleunigung der Programmausfuehrung, in einen be- 
stimmten Code umgewandelt. Ausserdem wird jeder Programmzei- 
le noch die Information ueber die Ablageposition der naech- 
sten Programmzeile mitgegeben, die das Suchen von Programn- 
zeilen (zum Beispiel bei Sprungbefehlen) vereinfacht und die 
Suchgeschwindigkeit erhoeht. Dies geschieht beim 'Abschik- 
ken' einer Programmzeile durch die RETURN-Taste. Auch Befeh- 
le, die im Direktmodus gegeben werden, werden in die soae- 
nannten 'Tokens' umgewandelt, bleiben jedoch im BASIC-Einaa- 
bepuffer ab Adresse 512 stehen. Daraus resultiert auch, wa- 
rum Befehle, die auch den Eingabepuffer benoetigen (INPUT, 
INPUT# und GET(#)), im Direktmodus im Normalfall nicht aus- 
gefuehrt werden koennen. 


Die Startadresse eines BASIC-Programms steht als Pointer in 
den Adressen 43 und 44 und kann durch ... 


PRINT PEEK(43) + 256 * PEEK(44) 


... abgefragt werden. Im Normalfall duerfte das Ergebnis 
gleich 2049 sein, da dies die vom Betriebssystem vorgesehene 
Startadresse fuer BASIC-Programme ist, die jedoch fuer eige- 
ne Anwendungen geaendert werden kann. 


Die ersten beiden Bytes jeder Programmzeile (bei der ersten 
Zeile eines Programms sind das die Speicherstellen 2149 und 
2050) enthalten die Startadresse der naechsten Zeile im 
Adressformat, wobei (wie das in fast allen Faellen der Ab- 
speicherung von 16-Bit-Werten ist) zuerst die Adresse low 
und dann die Adresse high abgespeichert wird. 


Die naechsten beiden Bytes stellen die Zeilennummer der Pro- 
grammzeile dar, die im Normalfall im Bereich von 0 bis 63999 
liegt. Durch 'POKE' ist es jedoch auch moeglich, hoehere 
Zeilennummern (bis 65535) zu erzeugen, was dann aber bei 
Sprungbefehlen und zum Beispiel bei 'INPUT' zu sicherlich 
unerwuenschten Effekten fuehren kann. 


Danach folgt der eigentliche Programmtext, wobei alle Befeh- 
le, Funktionen und Operatoren in Tokens codiert sind. Davon 
unbetroffen bleiben alle Texte, die innerhalb von Anfueh- 
rungszeichen stehen, Bemerkungen nach 'REM' sowie Daten nach 
einem 'DATA'-Befehl. Der Programmtext ist mit dem Nullcode 
abgeschlossen. 


Dieser Aufbau wiederholt sich bis zur letzten Zeile, der 
dann zwei Nullcodes folgen, die das Programmende markieren. 
Der Zeiger auf den Anfang der Variablentabelle zeigt auf das 
erste Zeichen nach den beiden (es sind, zusammen mit dem 
Nullcode zur Markierung des Endes der Programmzeile, drei 
aufeinanderfolgende Nullcodes) Nullcodes. Dieser ° Zeiger 
steht in den Adressen 45 und 46 und ist aeqauivalent dem 
Pointer auf den Anfang des BASIC-Programms abzufragen. 


Die Laenge eines Programms kann, unabhaengiq von eventuell 
schon definierten Variablen, durch folgende Befehlsfolge ab- 
gefragt werden 


PRINT PEEK(45) + 256 * PEEK(46) - PEEK(43) - 256 * PEEK(44) 


vas zum Beispiel bei sich selbst modifizierenden Pro- 
grammen oder waehrend der Entwicklung von Programmen zur 
Ueberwachung der Programmlaenge verwendet werden kann. 


Ein Beispiel fuer die intere Codierung 


Folgendes Programm wird, nach der Eingabe von 'NEW', um ein 
eventuell noch vorhandenes Programm zu loeschen, in den Com- 
modore 64 eingegeben. 


100 rem test 
500 print "Tokens 
999 end 


Diese drei Zeilen werden nun durch folgende Werte darge- 
stellt (der jeweils erste Wert einer Zeile gibt die Start- 
adresse der jeweiligen Zeile nur zum besseren Verstaendnis 
an und hat mit der Abspeicherung nichts zu tun). 


2049 12 8100 0143 32 84 69 83 84 0 
REM t e Ss t 


2060 28 8 244 1153 32 34 212 94 75 69 78 83 0 
PRINT „ T Oo k e n s 


2076 34 8 231 3 128 0 
END 


2082 0 0 


Betrachten wir nun die ersten beiden Bytes der ersten Pro- 
grammzeile, so stellen wir fest, dass diese auf die naechste 
Programmzeile zeigen (12 + 256 * ß = 2060). Diese beiden 
Bytes haben nun die Werte 28 und B und ergeben genau die 
Startadresse der dritten Programmzeile (28 + 256 * 8 = 
2076). Das gleiche ist auch bei der letzen Programmzeile der 
Fall, davon abgesehen, dass nun keine Programmzeile mehr 
folgt, sondern auf die beiden Nullcodes zur Kennzeichnuna 
des Endes eines Programms gezeigt wird. Diese Pointer, die 
jeweils auf den Pointer der naechsten Zeile zeigen, werden 
auch Linkpointer genannt, da sie die Verbindung zwischen den 
einzelnen Zeilen herstellen. 


Das jeweils dritte und vierte Byte von Programmzeilen aibt 
die Zeilennummer an. Da die Zeilennummern im Bereich von 0 
bis 63999 liegen koennen, werden sie, ebenso wie die Link- 
pointer, in zwei Bytes aufgespalten. So wird die Zeilennum- 
mer '999' durch die beiden Bytes 231 und 3 (231 + 256 * 3 = 
999) dargestellt. 


Der Programmtext selbst ist in Einzelbytes aufgebaut. Jedem 
Befehl ist ein Wert zugewiesen, in diesem Beispiel sind das 
'REM' mit dem Code 143, 'PRINT' mit dem Code 153 sowie 'END' 
mit dem Code 128. 


Waehrend die Leercodes direkt nach der Zeilennummer nicht 
abgespeichert werden, so ist. dies doch bei allen Leercodes 
der Fall, die ansonsten eingegeben werden. 


Eine vollstaendige Aufstellung der Tokens ist der Tabelle 
der Interpretercodes oder dem Betriebssystemlisting zu ent- 
nehmen. 


Takelle der BERASIC-Befehle. 


Die Befehle sind alphasketisch aesordrnet, da 
Reihe der Interpretercoades aus dem RüOM-Listi 


abs 
and 
3SC. 
atn 
chr$ 
close 
cir 
cmd 
cont 
cos 
data 
def 
dim 
end 
exp 
fn 
for 
fre 
get 
C 
goszuk 
Aatc 
if 
input 
input# 
int 


182 
175 
198 
193 
133 
180 


156 


157 
154 
130 
131 
154 
134 
128 
189 
1655 
129 
184 
181 
2093 
141 
137 
1:33 
133 
132 
181 


left$ 
lern 
let 
list 
load 
1ca4 
mid 
new 
next 
not 

ar 
aper 
cr 
peel: 
pake 
pas 
errint 
rrint# 
read 
rem 
restore 
return 
riaht$ 
rnd 
run 
zan,e 


ler 
ler 
1E 


new 
nE 
nC 
an 
or 
or 
rE 


258 
1353 
136 
155 
147 
133 
ea2 
162 
130 
188 
145 
153 
175 
134 
151 
135 
173 
132 
135 
143 
140 
142 
zual 
197 
138 
143 


Interpretercaodes 


Folsende Cades finden zusserdem Verwendung: 


a 


32 kis 95 identisch 


255 


und Akkuer zungen 


die Ruflistung 
n4 ersichtlich 


Nullcode am Zeilenende und Proar ammerde 


mit dem 


Coade fuer PI 


Die Codes li kis 31. 
Grundversion des Betriekssuvstems nicht verwendet. werden jedach 


teilweise von der Standard-ERSIC-Erweiteruna EXsEBRASIC 


kenutzt. 


9& kiss 127 


ıarıd 


ad bis 


Lonmadere—-ASCII 


zan eG 
sin =1 
sp. =P 
za =Uü 
step =tE 
stop =T 
str$ =tR 
sus er 
+tak: A 
tarı tar 
then tH 
+0 +0 
UeEr 115 
al A 
„eritw JE 
wait wAÄ 
+ + 

# # 

” e” 
224 werden 


LEVEL 


in 
ist, 


fe jeub feed jeub feeb fjmehb fe jun fe fen fe Sen feeb fen fee jemib 


LEN ohne! in 
Home) NO 


SAUNA N 
VONLUN-N 


fh fm eb be jenb jub jeeb fees 


der 


Il 


BINAERARITHMETIK 


Binaeres Rechnen und Umgang mit binaeren Zahlen wird beim 
Arbeiten mit dem Computer immer wieder benoetigt. Ganz 
gleich, ob es sich dabei um die hochaufloesende Graphik, die 
Definition von Zeichen oder das Aendern einzelner Bits in 
bestimmten Registern handelt. \ 


Eine Zahl im fuer uns gebraeuchlichen Dezimalsystem kann aus 
mehreren Ziffern bestehen. Dabei wird die hintere Ziffer als 
Einerstelle bezeichnet. Die vorletzte Ziffer ist die Zehner- 
stelle, die drittletzte Stelle bestimmt die Anzahl an Hun- 
dertern und so weiter. Von der Zahl eins fuer die letzte 
Stelle ausgehend wird der Stellenwert einer Ziffer fuer iede 
Stelle weiter links mit zehn multipliziert. Klar, denn unser 
Zahlensystem kennt schliesslich auch zehn Ziffern. Die Zahl 
1983 heisst also nicht anderes als... | 


1983 = 1 * 1000 + 9 * 100 +8 *10 +3 *] 


Da das Binaersystem jedoch nur zwei Zustaende kennt (Strom 
fliesst, Strom fliesst nicht), stehen hier also auch nur 
zwei verschiedene Ziffern zur Verfuegung. Die Stellenverte 
einzelner Ziffern koennen also nicht das zehnfache der 
rechts davon stehenden Ziffer betragen, sondern nur das Nop- 
pelte. Somit ergeben sich zum Beispie) fuer das Binaersystem 
folgende Stellenwerte: fuer die letzte Stelle, wie in jedem 
Zahlensystem, den Stellenwert eins, dann der Wert zwei, da- 
rauf vier, als Stellenwert fuer die viertletzte Stelle den 
Wert acht und entsprechend jeweils das Doppelte fuer weitere 
Stellen. 


Da als Ziffern nur die Zahlen O und 1 zur Verfuegung stehen, 
hat eine Stelle demnach entweder den Wert null (falls die 
Ziffer null an dieser Stelle steht) oder den Stellenvert der 
entsprechenden Stelle (falls die Ziffer eins an dieser Stel- 
le steht). Dieses eigentlich recht einfache Prinzip ist 
Grundlage jeglicher Operationen des Computers. Auch das 
Rechnen erfolgt im Binaersystem, die eingegebenen Dezimal- 
zahlen werden fuer interne Berechnungen naemlich erst in das 
Binaersystem umgewandelt. 


Die einzelnen Ziffern einer Binaerzahl, "Bits" genannt, wer- 
den von ihrer Position von rechts her mit Null beginnend 
durchnummeriert. Bit 4 zum Beispiel ist demnach die fuenfte 
Stelle einer Binaerzahl (von rechts!). Die Stellenwerte ]as- 
sen sich durch diese Vereinbarung sehr leicht errechnen. Es 
muss nur die Bitposition zur Basis zwei potenziert werden. 
Fuer Bit 4 ergibt dies einen Stellenvert von 2 4 (lies: 
zwei hoch vier), entsprechend dem Dezimalvert 16. Ein Bit 
(oder eine bestimmte Bitposition) zu SETZEN . heisst nun 
nichts anderes, als dieser Binaerstelle den Ziffernwert ']1' 
zuzuweisen. Das LOESCHEN eines Bits entspricht demnach der 
Zuweisung des Ziffernvwerts '0' an eine Bitposition. 


Da der Commodore 64 einen Prozessor mit einem "8-Bit-Daten- 
bus" besitzt, werden jegliche Speicheroperationen immer mit 
acht Bits gleichzeitig ausgefuehrt. Werden Daten aus dem 
Speicher gelesen, so werden immer acht Bits gelesen, so auch 
bei den Befehlen "POKE" und "PEEK", die immer Daten mit ei- 
ner Breite von acht Bits schreiben beziehunasveise lesen. 
Bei der sogenannten "vorzeichenlosen Binaerarithmetik" mit 
acht Bits haben die einzelnen Stellen folgende Stellenverte: 


10 


Der Minimalvert (alle Bits geloescht), den eine vorzeichen- 
lose Binaerzahl annehmen kann, ist demnach der Wert 0, der 
Maximalwert (alle Bits gesetzt) einer achtstelligen Binaer- 
zahl ist 255. Eine solche Binaerzahl mit einer Breite von 
acht Bits nennt man auch "Byte". Ein Byte ist also gleichzu- 
setzen mit acht Bits. 


Zusaetzlich zu den Bytes existieren nun noch die "Adressen". 
Eine Adresse ist eine vorzeichenlose Binaerzahl, die aus 
sechzehn Bits (entsprechend zwei Bytes) besteht. Durch eine 
Adresse kann die Position bestimmter Stellen im Arbeitsspei- 
cher festgelegt werden. Zwei aufeinanderfolgende Bytes im 
Arbeitsspeicher, die auf eine andere Stelle verweisen, nennt 
man "Pointer". 


Hierzu gleich zwei Programme, die die Umwandlung einer na- 
tuerlichen Dezimalzahl ins Binaersystem und umgekehrt vor- 
nehmen: 


Binaer nach Dezimal: 


100 INPUT B$ : D =D : FOR I = 1 TO LEN (B$) 

110 S$ = MID$ (B$, I, 1) 

120 IF S$ C "o" OR S$ > "1" THEN I = LEN (B$) : NEXT : END 
130 D =D * 2 +» ASC (S$) - 48 : NEXT : PRINT D : END 


Dezimal nach Binaer: 


200 INPUT D : B$ = "" 

210 R = INT (D / 2) : B$ = CHR$ (D- R* 2 + 48) + B$ 
220D=R : IF R GOTO 210 

230 PRINT B$ : END 


Bei der Umwandlung ins Binaersystem werden die Binaerzahlen 
so umgewandelt, dass fuehrende Nullen unbeachtet bleiben. 
Ist eine Darstellung des Binaeraequivalents von Dezimalzah- 
len im Bereich von OD bis 255 in Form von acht Binaerstellen 
erwuenscht (Auffuellen auf eine Laenge von acht Ziffern), so 
ist folgende Programmzeile hinzuzufuegen: 


225 IF LEN (B$) C 8 THEN B$ = RIGHT$ ("0000000" + B$, 8) 


Allerdings kann ein Byte nicht nur die Funktion der Darstel- 
lung einer Zahl haben (arithmetische Funktion). Es ist moeg- 
lich, dass jedem Bit in einem Byte eine bestimmte Funktion 
zukommt (logische Funktion). So koennen anhand eines Bytes 
insgesamt acht Bedingungen mit je zwei Moeglichkeiten abge- 
prueft werden. Man nennt in diesem Fall ein solches Bit, mit 
der Bedeutung als Hinveis fuer eine Ja/Nein-Entscheidung, 
eine "Flag", was soviel heisst wie "Flagge". 


Solche "Flags" treten besonders in bestimmten "Registern" 
auf. Ein Register ist ein Byte innerhalb des Arbeitsbereichs 
des Computers, das eine bestimmte funktion erfuellt. Dies 
sind zum Beispiel die Register des VIC-II-Chips, anhand de- 
rer bestimmte Funktionen des Video-Chips festgelegt werden, 
oder viele Adressen im Bereich von O bis 1023. 


11 


Zur Manipulation von Binaerzahlen stehen beim Commodore- 
BASIC zwei Befehle zur Verknuepfung zweier Binaerzahlen zur 
Verfuegung: "AND" und "OR". Die beiden Operatoren bevirken, 
dass die beiden Argumente als Binaerzahlen Bit fuer Bit 
(insgesamt verarbeiten die Befehle 16 Bits, jedoch mit vVor- 
zeichen, was aber beim Arbeiten mit 8-Bit-Zahlen unbeachtet 
bleiben kann) verglichen werden und gleichzeitig das Ergeb- 
nis aufgebaut wird. Werden zwei Zahlen mittels "OR" ver- 
knuepft, so sind in der Ergebnis-Binaerzahl saemtliche Bit- 
positionen geloscht, bei denen beide Bitpositionen der bei- 
den Argumente geloescht waren, alle anderen Bits sind ge- 
setzt. Bei "AND" sind entsprechend alle Bits gesetzt, bei 
denen beide Bitpositionen der Argumente gesetzt waren, ande- 
re Bitpositionen sind geloescht. Dadurch laesst sich nun be- 
wirken, dass innerhalb eines Registers durch "PEEK" und 
"POKE" einzelne Bits gesetzt und geloescht werden koennen. 


Soll zum Beispiel ein bestimmtes Bit (mit dem Stellenvert N) 
an der Adresse A ‚gesetzt werden, so kann dies durch ... 


POKE A, PEEK (A) ORN 


... erfolgen. Dies erklaert sich daraus, dass jegliche Bits, 
die durch "OR" mit dem Ziffernwvert '0' verknuepft werden, 
unbeeinflusst bleiben. Wird jedoch eine Verknuepfung durch- 
gefuehrt, bei der mindestens eins der beiden Bits gesetzt 
ist, so ist auch im Ergebnis dieses Bit gesetzt. 


Aehnlich verlaeuft ‘dies beim Loeschen von Bits, was aber nur 
mittels "AND" moeglich ist. Wird naemlich ein Bit durch 
"AND" mit dem Wert '0O' verknuepft, so ist das Ergebnisbit 
auch geloescht. Allerdings muss nun erreicht werden, dass 
die uebrigen Bits unbeeinflusst bleiben. Dies ist dann der 
Fall, wenn sie bei der "AND"-Verknuepfung mit dem Wert ']' 
verknuepft werden. Es muss also nun mit einem Byte gearbei- 
tet werden, bei dem das Bit, das geloescht werden soll, den 
Bitwert '0' hat, alle uebrigen Bits den Wert ']1'. Entspre- 
chend dem Beispiel fuer das Setzen von Bits erreicht man das 
Loeschen durch 


POKE A, PEEK (A) AND (255 - N) 


Die Klammern fuer die Subtraktion dienen nur der Uebersicht 
und koennen entfallen, da der Operator '-' einer hoehere 
Prioritaet als 'AND' hat und daher auf jeden Fall vorher 
ausgefuehrt wird. 


Sollen mehrere Bits gleichzeitig entweder gesetzt oder ge- 
loescht werden, so kann dies durch Addition der Stellenverte 
erfolgen. 


Zur Bezeichnung von Binaerziffern und zusammengesetzten Bi- 
naerziffern existieren noch weitere gebraeuchliche Begriffe: 
So zum Beispiel MSB und LSB (Most/Least Significant Byte): 
Ein MSB ist das Byte innerhalb einer Kette von Bytes, dem 
der hoechste Stellenwert zukommt. Bei einer Adresse waere 
dies das Byte mit den Stellenwerten von 256 bis 32768. Das 
LSB ist entsprechend das niederwertigste Byte. Bei Adressen 
sind nur zwei Bytes verwendet, jedoch findet sich dieser Be- 
griff auch bei der Verwendung von Binaerziffern mit mehr als 
16 Stellen (Bits). Die Begriffe MSB und LSB werden jedoch 
auch im Zusammenhang mit Bits verwendet. Hierbei ist dann 
mit MSB (Most Significant Bit) das hoechstwertige Bit (in- 
nerhalb eines oder mehrerer Bytes) gemeint. 


Auch gebraeuchlich sind (oft auch im Zusammenhang mit Zahlen 
im Hexadezimalsystem oder gepackten BCD-Ziffern) die Be- 
zeichnung MSN und LSN, die fuer die Bezeichnung von 
"Nybbles" verwendet werden. Ein Nybble ist ein halbes Byte, 
also vier Bits. Ein Byte besteht daher aus zwei Nybbles, das 
eine besteht aus den Bits der Positionen O bis 3 (LSN), das 
andere entsprechend aus den Bits 4 bis 7 (MSN). | 


Noch eine kurze Anmerkung zum Hexadezimalsystem: Dieses Zah- 
lensystem baut auf der Basis 16 (entsprechend 16 verschiede- 
nen Ziffern) auf. Diese Ziffern sind die Zahlen von '0' bis 
'9' sowie die Buchstaben von 'A' bis 'F', wobei die Buchsta- 
ben fuer die Dezimalwerte von 10 bis 15 stehen. Dieses Zah- 
lensystem fand und findet hauptsaechlich auf Einplatinensys- 
temen Anwendung, wo die Moeglichkeit einer Programmierung im 
Dezimalsystem ein zu aufwendiges Monitorprogramm benoetigen 
wuerde (Hexadezimalzahlen lassen sich leichter ins fuer den 
Computer verstaendliche Binaersystem umsetzen). Doch mit dem 
Aufkommen von groesseren Computern wurde in vielen Faellen 
dieses fuer den Menschen doch sehr ungebraeuchliche Zahlen- 
system mituebernommen, anstatt dem Programmierer durch Ver- 
wendung des Dezimalsystems entgegenzukommen. Mittlerweile 
haben sich viele Programmierer fuer die Assemblerprogrammie- 
rung im Dezimalsystem entschlossen, da dieses ein wesentlich 
komfortableres Arbeiten erlaubt. Das Hexadezimalsystem fin- 
det seine Berechtigung nur auf Minimalsystemen und nicht auf 
Computern, die im Normalfall (BASIC, PASCAL etc.) sowieso 
zum Arbeiten im Dezimalsystem konzipiert sind. 


Zurueck zum Binaersystem: Es kann auch vorkommen, dass Dezi- 
malzahlen mit Nachkommastellen ins Binaersystem umgewandelt 
werden muessen. Hierbei wieder ein Vergleich mit dem Dezi- 
malsystem: Die Stelle vor dem Komma (die Einerstelle) hat 
ein Zehntel des Wertes der Stelle links davon (Zehnerstel- 
le), demnach hat die erste Stelle nach dem Komma den Wert 
'0.1', die naechste den Wert '0.01' und so weiter. Im Bi- 
naersystem hat demnach die erste Nachkommastelle den Wert 
'0.5' (hier wird naemlich durch zwei dividiert, nicht durch 
zehn), die zweite Nachkommastelle den Wert '0.25', die 
naechste '0.125'. Soll eine Dezimalzahl mit Nachkommastellen 
ins Binaersystem umgewandelt werden, so hat zuerst die Unm- 
wandlung des Vorkommateils zu erfolgen. Der Nachkommateil 
wird nun verdoppelt (die Binaerzahl wird also um eine Ziffer 
nach LINKS verschoben). Die Ziffer, die sich nun als Vorkom- 
mastelle ergibt (entweder '0' oder '1l'), ist die erste Nach- 
kommastelle. Mit dem Nachkommateil dieser verdoppelten Zahl 
wird nun genauso verfahren: Verdopplung und Verwendung der 
Vorkommastelle als naechste Nachkommastelle. Daraus resul- 
tiert natuerlich, dass nicht alle Dezimalzahlen sich abbre- 
chend ins Binaersystem umwandeln lassen. So ist zum Bei- 
spiel die Dezimalzahl '0.1' eine periodische Binaerzahl: 


0.1 (dezimal) = 0.0001100110011001100110011... (binaer) 


Ausser der Darstellung von gebrochenen Zahlen wird beim Un- 
gang mit Binaerzahlen nun noch die Darstellung von negativen 
Zahlen benoetigt: Eine Moeglichkeit der Darstellung von Bi- 
naerzahlen ist, das Vorzeichen in Form einer Flag zusammen 
mit der Zahl abzuspeichern. Diese Methode wird bei der win- 
ternen Darstellung von Fliesskommazahlen beim Commodore- 
BASIC (siehe dort) verwendet. Es wird nur der Betrag der 
Zahl abgespeichert, aber zusammen mit einem Bit, das angibt, 
ob die Zahl positiv oder negativ ist. 


13 


Bei der gebraeuchlicheren Methode erfolgt die Darstellung in 
Form des sogenannten "Zweierkomplements". Erst einmal zum 
Begriff der Komplements: das "Einserkomplement" einer Bi- 
naerzahl ergibt sich aus der invertierten Darstellung der 
Ausgangszahl. Jede Ziffer wird durch die entgegengesetzte 
Ziffer dargestellt, die '0' wird durch die '1' ersetzt und 
umgekehrt. So ist das Komplement von 'O01101110' gleich 
'10010001'. Das Zweierkomplement entspricht nun dem um den 
Wert eins erhoehten Einserkomplement. Hierzu ein Beispiel: 


12 (dezimal) = 00001100 (binaer) 
Einserkomplement von 00001100 (binaer) = 11110011 (binaer) 
11110011 (binaer) + 1 (binaer) = 11110100 (binaer) 


Wird nun die positive Zahl zu ihrem Zweierkomplement ad- 
diert, so ist das Ergebnis gleich null. 


Aus dieser Darstellung einer Binaerzahl mit Vorzeichen Te- 
sultiert jedoch jetzt, dass Bit 7 (falls nur mit acht Bits 
gearbeitet wird) nun nicht mehr den Stellenwert 128, sondern 
vielmehr -128 hat. Addiert man nun die Ziffernverte der Zahl 
'-12' aus dem obigen Beispiel (-128 + 64 + 32 + 16 + 4), so 
erhaelt man auch den korrekten Wert. Auch beim Commodore- 
BASIC wird bei den Operatoren "AND", "OR" und "NOT" (dieser 
Befehl errechnet das Einserkomplement) mit vorzeichenbehaf- 
teten Binaerzahlen gerechnet, jedoch mit Binaerzahlen einer 
Breite von sechzehn Bit. Daraus ergibt sich, dass Bit 15 
nicht den Wert 32768, sondern -32768 hat (Bit 7 behaelt den 
normalen Wert von 128). Wird zum Beispiel eingegeben 


PRINT NOT O 


... so erhaelt man den auf den ersten Blick unsinnigen Wert 
'-1' als Ergebnis. Da jedoch das Einserkomplement von '0' 
(oder in Binaer '0000 0000 0000 0000') gleich '1111 1111 
1111 1111' ist, erhaelt man nun durch Addition aller Stel- 
lenverte den Wert '-1'. Auch die Statusvariable 'ST' wird 
als 8-Bit-Zahl mit Vorzeichen angesehen. Dies kann man je- 
doch umgehen durch 


PRINT 255 AND ST 


... da hierdurch der Wert von ST (8 Bits) zuerst in 16 Bits 
umgewandelt wird (die Ziffer von Bit 7 wird in die Positio- 
nen 8 bis 15 uebertragen), dann werden die Bits 8 bis 15 ab- 
geschnitten. Da jedoch bei logischen Operatoren nicht Bit 7, 
sondern Bit 15 gesetzt sein muss, um negative Zahlen darzu- 
stellen, wird nun der Wert von 'ST' so ausgegeben, als sei 
er eine vorzeichrenlose Zahl. Der Wertebereich von 8-Bit-Zah- 
len mit Vorzeichen ist -128 bis 127, bei 16-Bit-Zahlen von 
-32768 bis 32767 (beim Commodore-BASIC kann die Zahl -32768 
als Ergebnis einer logischen Operation auftreten, als Argu- 
ment wird sie jedoch durch die Fehlermeldung "?ILLEGAL 
QUANTITY ERROR" zurueckgeviesen). 


Eine weitere Darstellungsveise fuer Zahlen ist das gepackte 
BCD (binary coded decimal) Format (wird im Dezimalmodus der 
65er CPUs direkt verarbeitet, andere CPUs besitzen Befehle 
zur Anpassung): Hier entspricht jedes Nybble eines Bytes ei- 
ner Dezimalstelle. Jedoch nimmt dieses Nybble jetzt nicht 
mehr die Werte von O bis 15, sondern nur noch die Werte von 
D bis 9 an. Ein Byte, das eine Zahl im gepackten BCD-Format 
enthaelt, kann daher jetzt nur noch Zahlen im Bereich von O0 
bis 99 enthalten. Zum Beispiel wird die Dezimalzahl '49' im 
BCD-Format als '0100 1001' gespeichert. Das MSN hat den Wert 
4, das LSN den Wert 9. 


14 


DARSTELLUNG VON FLIESSKOMMAZAHLEN IM CBM-BASIC 


Das BASIC des Commodore 64 bietet die Fliesskommazahlen als 
Variablentyp an. Die Darstellung derselben unterscheidet 
sich jedoch so stark von der Darstellung von Integervaria- 
blen (die problemlos ins Dezimalsystem rueckuebersetzbar 
sind), so dass hier gesondert darauf eingegangen werden 
soll. Fliesskommawerte werden innerhalb der Variablentabelle 
in fuenf Bytes abgespeichert (siehe Darstellung von Varia- 
blen). Auf die Bedeutung dieser fuenf Bytes soll im folgen- 
den eingegangen werden. 


Als Beispiel dient hier die Abspeicherung der Zahl 
'-9876.25'. Der erste Umwandlungsschritt ist die Darstellung 
dieser Zahl im Binaersystem. Das Vorzeichen bleibt hierbei 
unberuecksichtigt, da negative Zahlen nicht in Form des um 
eins erhoehten Einserkomplements dargestellt werden, sondern 
das Vorzeichen getrennt angegeben wird. Die Zahl '9876.25' 
sieht im Binaersystem nun wie folgt aus: 


9876.25 (dezimal) = 10011010010100.01 (binaer) 


Nun lassen sich Binaerzahlen, wie Zahlen eines jeden anderen 
Zahlensystems auch, in Exponentialdarstellung bringen. So 
vie die Dezimalzahl ... 


25000 zu 2.5E+04 


... wird, so laesst sich auch die obige Binaerzahl in Expo- 
nentialdarstellung (zur Basis zwei) bringen. Wird nun das 
Komma (unter Erhoehung des Exponenten) so verschoben, dass 
keine Zahl mehr vor diesem steht (und direkt nach dem Komma 
eine eins), so entspricht dies schon im ungefaehren der Dar- 
stellung im CBM-BASIC. Die Zahl im obigen Beispiel wuerde 
nun wie folgt aussehen: 


10011010010100.01 = 0.1001101001010001 E 1110 


... saemtliche Zahlen im Binaersystem. Der Exponent ent- 
spricht der Dezimalzahl 14, da das Komma schliesslich um 14 
Stellen nach links verschoben wurde. Bei einer Verschiebung 
nach rechts waere der Exponent negativ. Zu diesem Exponen- 
ten wird nun der Wert 128 addiert, man erhaelt das erste 
Byte des Variablenverts bei Real-Variablen, aus dem man wie- 
derum den Exponenten errechnen kann. Um nun die restlichen 
vier Bytes zu erhalten, muss folgendermassen vorgegangen 
werden: Man unterteilt die Mantisse der Binaerzahl in vier 
Gruppen zu je acht Ziffern (falls nicht genug Ziffern vor- 
handen sind, wird der Rest mit Nullen aufgefuellt) und er- 
setzt die erste Ziffer (das war der Ziffernwert eins, der 
eine Stelle rechts des Kommas stand) im ersten Block mit 
acht Ziffern durch die Vorzeichenflag (positiv = 0, negativ 
= l). Das Komma kann ab hier entfallen, es ist nur die Zif- 
fernfolge von Bedeutung. Hier wieder unser Beispiel 


Mantissenziffernfolge: 1001101001010001 
In Bloecke unterteilt: 10011010 01010001 00000Nn0N NnoNnOonnan 
Ersetzung der ersten Ziffer durch die Vorzeichenflag: 

1 0011010 01010001 00CnHAANN AOnananN 
In diesem Fall aendert sich die erste Ziffer nicht, da wir 


ja von einer negativen Zahl ausgegangen sind. Waere die Zahl 
positiv,-so waere die erste Ziffer eine Null. 


15 


Die nun folgenden Umwandlungsschritte macht der Rechner nun 
nicht mehr mit, da er selbst ja normalerweise auch im Bi- 
naersystem arbeitet und so die Zahlenbloecke nicht mehr zur 
veiteren Verarbeitung ins Dezimalsystem konvertieren muss. 


Wie gesagt werden diese vier Bloecke zu acht Ziffern (Bits) 
nun ins Dezimalsystem umgewandelt. Man erhaelt so die weite- 
ren vier Bytes des Variablenwerts. Im Endeffekt wird unsere 
Zahl (falls sie einer Variablen zugeviesen wird) abgespei- 
chert als 


142 154 81 0 0 


Das erste Byte ist der (Binaer-) Exponent (zur Basis 2, um 
128 erhoeht), der Rest stellt die Mantisse und das Vorzei- 
chen dar. 


Die Zahlendarstellung in den Rechenregistern (FAC und ARG, 
auch Fliesskommaakkumulatoren #1l und #2 genannt) des Be- 
triebssystems ist ein wenig anders. Hier wird das fuer das 
Vorzeichen zustaendige Bit wieder durch eine eins ersetzt 
und das Vorzeichen selbst in einer getrennten Zeropage- 
Adresse abgespeichert. Zusaetzlich besitzt FAC (Floating- 
point ACcumulator) im Unterschied zu ARG (floatingpoint 
ARGument) noch eine Rundungsstelle, die einem fuenften Man- 
tissenbyte gleichkommt. 


16 


DARSTELLUNG UND ABLAGE VON VARIABLEN 


Die Variablen werden im Commodore-BASIC in drei Bloecken va- 
riabel verwaltet. Es handelt sich dabei um die einfachen 
(nichtindizierten) Variablen, die indizierten Variablen, 
Felder oder Arrays genannt, sowie die Inhalte der Stringva- 
riablen, die in einem weiteren Datenblock verwaltet werden. 


Der erste Block liegt direkt hinter dem BASIC-Programm, wo- 
durch auch klar wird, warum Variablen durch Programmaende- 
rungen geloescht werden - es werden beim Einbau von Pro- 
grammzeilen die Variablen einfach ueberschrieben. Der Point- 
er (45/46) zeigt auf den Beginn des Variablenbereichs, das 
Ende wird durch den Anfangspointer auf den Block mit den in- 
dizierten Variablen bestimmt, die direkt hinter den nichtin- 
dizierten stehen. Diese Startadresse der Feldvariablentabel- 
le wird durch den Pointer (47/48) festgelegt. Die Endadresse 
(plus eins, wie alle Endpointer) steht in (49/50). 


Die Tabelle der nichtindizierten Variablen ist in Eintraege 
zu je sieben Bytes aufgeteilt, die den Variablennamen und 
den Inhalt (beziehungsweise den Pointer auf den Inhalt) ent- 
halten. Bei den Eintraegen handelt es sich um die Real-Vari- 
ablen, die Integer-Variablen, die Strings sovie die mittels 
'DEF' definierten "Variablen". Der Aufbau eines Eintrags in 
folgender Tabelle in einer Uebersicht: 


Typ [Byte O|Byte 1|Byte 2 [Byte 3 |Byte 4 | Byte 5 |Byte 6 


real| reset Variablenwert von MSB bis LSB 


Startadresse ILH| 
Startadresse LH| Variablenp. LH 


Der Variablenname steht in den ersten beiden Bytes, und da 
Zeichen des Variablennamens nur Buchstaben oder Zahlen sein 
duerfen, wird Bit 7 zusaetzlich zur Markierung des V\Varia- 
blentyps verwendet. Die Angabe 'set' beziehungsweise 'reset' 
bezieht sich also auf Bit 7 des Variablennamens. Die wveite- 
ren fuenf Bytes geben, sofern benutzt, den Variablenvert an. 
Die Aufteilung dieser fuenf Bytes bei den Reals und Integers 
bedarf keiner weiteren Erklaerung. 


Die Angabe 'Startadresse LH' bei Eintraegen von Stringvaria- 
blen bezieht sich auf die Startadresse (erst low, dann hiah) 
des Stringinhalts, der entweder im Programm (bei Direktzu- 
weisungen) oder am Ende des Arbeitsspeichers liegen kann 
(Stringoperationen oder Eingaben). Ist die Stringlaenge 
gleich null, so ist die Startadresse natuerlich egal. 


FN-Variablen enthalten einerseits den Pointer auf den Aus- 
druck, der auszuwerten ist, sowie den Pointer auf die FN-Va- 
riable, die im Ausdruck verwendet wird. Beim Aufruf einer 
selbstdefinierten Funktion wird der Inhalt der FN-Variablen 
gerettet, das Argument des FN-Ausdrucks in die Variable 
uebertragen, der Ausdruck ausgevertet (bei Fehlern im Aus- 
druck wird die Zeilennummer, in der das FN steht, ausgege- 
ben, nicht die des FN-Ausdrucks) und zur weiteren Verwendung 
in FAC uebertragen. Danach wird der Inhalt der FN-Variablen 
wiederhergestellt und das Programm an der Stelle hinter dem 
FN-Aufruf fortgesetzt. 


Das Suchen und Anlegen von Variablen kann durch die Routine 
'"VARSUC' (ab 45195) durchgefuehrt werden. 


17 


Der Block am Ende des Arbeitsspeichers enthaelt die String- 
inhalte, sofern sie nicht direkt im Programm zugewiesen wur- 
den. Diese Stringinhalte reichen bis zum Ende des Arbeits- 
speichers (Endadresse im Pointer (55/56)) und werden nach 
unten hin angebaut. Saemtliche Zwischenergebnisse bei 
Stringoperationen werden abgespeichert und dann zu weiteren 
Berechnungen herangezogen. Ist ein Ausdruck ausgewertet, so 
verden die "Reste", die Zwischenergebnisse und frueheren 
Stringinhalte, nicht beseitigt, sondern unveraendert im 
Block gelassen, dessen Anfang, festgelegt durch den Pointer 
(51/52), sich immer weiter in Richtung der Variablentabelle 
bewegt. Wird nun beim Einbau einer neuen Variablen, eines 
Variablenfeldes oder eines weiteren Strings mehr Platz be- 
noetigt, als momentan verfuegbar ist, so werden diese un- 
gueltigen Strings durch eine Routine namens "GARBAGE 
COLLECT" (woertlich uebersetzt: Abfallsammlung) beseitigt. 
Ist nun immer noch nicht genug Platz vorhanden, so wird ein 
"OUT OF MEMORY" ausgegeben, ansonsten wird die Ausfuehrung 
normal fortgesetzt. GARBAGE COLLECT kann durch die Funktion 
'FRE(O)' erzwungen werden. 


Man sollte uebrigens, wenn ein Programm grosse Felder ver- 
vendet, aus Zeitgruenden normale Variablen VOR der Dimensio- 
nierung von Feldern anlegen, da sonst, um eine Variable ein- 
zufuegen, der gesamte Block mit Feldvariablen durch eine 
sehr zeitaufwendige Routine um sieben Bytes nach oben ver- 
schoben werden muss. 


Nun zum Aufbau von Feldern: Eintraege einzelner Elemente von 
Feldvariablen sind, im Gegensatz zu nichtindizierten Varia- 
blen, unterschiedlich lang. 50o benoetigt eine Realvariable 
zwar, wie sonst auch, fuenf Bytes, um den Wert darzustellen, 
Integer- und Stringvariablen jedoch werden nun nicht mehr 
mit Nullen aufgefuellt, sondern nur noch so lang abgespei- 
chert, wie Werte verwendet werden; zwei Bytes bei Integerva- 
riablen und drei Bytes bei Strings. 


Zu Beginn eines Feldes steht der sogenannte Arrayheader, ein 
Kopfeintrag, der die Informationen ueber das Feld enthaelt. 
Dies sind Angaben ueber die Anzahl Dimensionen, die Spalten- 
laenge(n), die Feldlaenge und natuerlich der Name des Fel- 
des. Auch hier sind die Namensmarkierungen identisch denen 
bei nichtindizierten Variablen, auch wenn es natuerlich kei- 
ne Felder vom Typ 'FN' gibt. Ist das zweite Byte eines Va- 
riablennamens nicht benutzt, so wird auch hier der Code 0 
beziehungsweise 128 (abhaengig vom Variablentyp) als zweites 
Zeichen gespeichert. 


Hier ein schematischer Aufbau des Arrayheaders: 


Byte O0 |Byte 1 |Byte 2 | Byte 3 |Byte 4 |Byte 5 |Byte 6 
erstes | zweites| Feldlaenge in Anzahl | Spaltenlaenge 
Zeichen! Zeichen] LH Darstellung | Dimens.| HL Darstellung! 


Byte 5 und 6 werden, je nach Anzahl an Dimensionen, wieder- 
holt. Dabei muss beachtet werden, dass die letzte Spaltenan- 
gabe beim DIM-Befeh]l als erster Eintrag abgespeichert wird. 
Ausserdem wird die Spaltenlaenge und nicht die Zahl beim 
DIM-Befehl im Arrayheader eingetragen, da schliesslich noch 
ein Element mit dem Index Null existiert (der Wert im Kopf- 
eintrag ist also um eins hoeher als der Parameter im DIM-Be- 
fehl). 


18 


Hierzu ein Beispiel: ein Stringfeld soll durch folgenden 
DIM-Befehl angelegt werden: 


DIM X5$ (2,5,567) 


Das Feld wird nun folgendermassen im Arbeitsspeicher abge- 
legt: 


Feldadresse Inhalt Bedeutung 


plus ... 
0 88 Code fuer "X" (Bit 7 geloescht) 
1 181 Code fuer "5" (Bit 7 gesetzt) 
2 219 Feldlaenge in Low/High Darstellung 
3 119 (ist hier gleich 30683) 
4 3 Anzahl an Dimensionen des Feldes 
5 2 Wert 568 fuer Spaltenlaenge 
6 56 (High/Low Darstellung!) 
7 0 Wert 6 fuer Spaltenlaenge 
8 6 
9 0 Wert 3 fuer Spaltenlaenge 
10 3 
ll - Stringlaenge fuer Element (0,0,0) 
12 - zugehoerige Startadresse in 
13 - Low/High Darstellung 
... San 10222 weitere Stringelemente 
30680 - Stringlaenge fuer Element (2,5,567) 
30681 - zugehoerige Startadresse in 
30682 - Low/High Darstellung 


Die Zaehlweise der Elemente innerhalb des Feldes geht fol- 
gendermassen vor sich: Die erste Spalte ist die "niedervwer- 
tigste Spalte", die letzte die "hoechstvertigste". Der auf 
den ersten Eintrag im obigen Beispiel folgende Eintrag waere 
der des Elements (1,0,0), darauf (2,0,0) und dann (0,1,0) 
und so weiter. 


Nun ist es auch einfach, eine Methode zur Berechnung der 
Laenge eines Feldes zu entwickeln. Man multipliziert die um 
eins erhoehten (Null-Eintrag!) Parameter des DIM-Befehls 
miteinander, multipliziert dies mit der Laenge eines Ein- 
trags (Real = 5, String = 3, Integer = 2) und addiert dazu 
den Wert fuenf und die doppelte Anzahl Dimensionen. Das obi- 
ge Feld belegt nach dieser Formel 


(2+1) * (5+1) * (567 +1) * 3+5+3%*2 


; gleich 30683 Bytes. Dies ermoeglicht es in Programmen, 
den Anwender auf eine freundlichere Art als "OUT OF MEMORY" 
darauf aufmerksam zu machen, dass der Arbeitsspeicher nicht 
ausreicht. Man muss vor Ausfuehrung des DIMs nur die Feld- 
laenge mit dem noch freien Platz vergleichen. 


19 


DIE VERWENDUNG DER USR-FUNKTION 


Das Commodore-BASIC verfuegt ueber eine Funktion mit dem Na- 
men "USR". Waehrend man im Normalfall durch Verwendung die- 
ser Funktion nur einen "?ILLEGAL QUANTITY ERROR" erzielen 
kann, so koennen durch Maschinenprogramme der "USR"-Funktion 
viele Bedeutungen (fast) aller Art zugeviesen werden. Eine 
dieser speziellen Aufgaben ist zum Beispiel die "PEEK"-Funk- 
tion, die immer den Inhalt des RAMs liest (siehe Speicher- 
verwaltung). Auch das Arbeiten mit der internen Uhr (siehe 
CIA, Time of Day) erfaehrt eine erhebliche Vereinfachung, 
wenn man ein geeignetes Programm zur Bedienung der Uhr an- 
wendet. Um ein problemloses Implementieren eigener Funktio- 
nen so einfach wie moeglich zu machen, hier eine Beschrei- 
bung: 


Die Funktion "USR" ist eine Funktion wie jede andere auch, 
sei es nun eine mathematische Funktion wie "SIN" oder "EXP", 
eine spezielle Funktion im Zusammenhang mit Strings (zum 
Beispiel "VAL" oder "CHR$") oder nur etwas systemspezifi- 
sches wie "PEEK" oder "FRE". Allen diesen Funktionen, deren 
Interpretercodes im Bereich von 180 bis 199 liegen, ist ge- 
meinsam, dass sie EIN Argument benoetigen, auch wenn es (vie 
im Falle von "POS" und "FRE") nicht beachtet wird, dessen 
Typ (numerisch oder String) festgelegt ist. Alle diese Funk- 
tionen liefern ausserdem EIN vom Typ her festgelegtes Ergeb- 
nis. 


In der gleichen Weise funktioniert die "USR"-Funktion auch. 
Man gibt ein Argument mit und erhaelt ein Ergebnis. Der je- 
weilige Typ (sowohl Argument, als auch Ergebnis) wird durch 
das zugehoerige Maschinenprogramm festgelegt und kann nicht 
nur, wie dies besonders in Literatur zum PET und zu den CBMs 
immer wieder behauptet wird, im Integerbereich von -32767 
bis 32767 liegen. 


Die vom Betriebssystem festgelegte Startadresse der USR- 
Funktion ist 784 (siehe Vektortabelle der BASIC-Funktionen). 
Dort befindet sich aber der sogenannte USR-Vektor, also, ein 
"JMP", dessen Argument vom Benutzer festzulegen ist. Im Nor- 
malfall zeigt das Argument dieses "JMP"-Befehls (Code 76, 
dezimal) auf die Fehlermeldung "?ILLEGAL QUANTITY ERROR", 
vodurch dieser Fehler auch bei Nichtsetzen des USR-Vektors 
und Benutzung des Befehls auftritt. Soll also das Maschinen- 
programm zur Definition der USR-Funktion beispielsweise an 
der Adresse 828 (Cassettenpuffer) beginnen, so muss dies dem 
Computer durch 


POKE 785, 60 : POKE 786, 3 


... mitgeteilt werden. Die Reihenfolge der Abspeicherung ist 
natuerlich low/high. Nun zur Struktur von Funktionen im all- 
gemeinen: 


Das Betriebssystem wertet beim Erkennen einer Funktion (die 
Funktionen LEFT$, RIGHT$ und MID$ bilden eine Ausnahme, da 
sie mehrere Argumente benoetigen) das im Klammern stehende 
Argument, unabhaengig vom Typ des Arguments, aus. Sollte. es 
sich bei dem Argument um einen numerischen Ausdruck handeln, 
so wird diese Zahl im Fliesskommaaccu #1 (Floatingpoint 
ACcumulator, FAC) abgelegt. Dabei handelt es sich um das 
Hauptrechenregister des Microsoft-BASICs. Dieses Argument 
kann dann durch Betriebssystemroutinen entsprechend weiter- 
verarbeitet werden. Eine Unterscheidung zwischen Realzahlen 
und Integerzahlen wird hier nicht gemacht. 


20 


Handelt es sich jedoch um ein Argument des Typs String, so 
wird der Descriptor (bestehend aus drei Bytes, die die Laen- 
ge und Startadresse festlegen) dieses Strings in die De- 
scriptortabelle gebracht. Durch die Routine "FRESTR" (Ein- 
sprungadresse 46755) wird zuerst geprueft, ob es sich bei 
dem Argument auch um einen String handelt. Daraufhin wird 
der durch den String belegte Speicherbereich wieder freige- 
geben und der Pointer (34/35) auf die Startadresse des 
Strings gesetzt. Der Accu enthaelt nach Rueckkehr die 
Stringlaenge. 


Mit diesen Angaben kann nun die Auswertung beginnen: Als 
Beispiel soll hier eine mathematische Funktion dienen: die 
im Commodore-BASIC nicht implementierte Umkehrfunktion zur 
SINUS-Funktion. Die Umrechnungsformel lautet 


ARC SIN (X) = ATN (X / SQR (1-X*xX)) 


Sollen von Maschinensprache aus Funktionen ausgevertet ver- 
den, so muss das Argument sich in FAC befinden. Nach Aufruf 
durch "JSR" befindet sich ebenfalls in FAC das Ergebnis. 
Fuer Operationen wie "-" oder "*" muss anders vorgegangen 
verden. Hier muss der erste Wert in das Rechenregister ARG 
(floatingpoint ARGument) uebertragen verden, der zweite Wert 
zur Ausfuehrung der Operation befindet sich (vie das Ergeb- 
nis der Operation auch) in FAC. Es muss also die Funktion 
zerlegt werden, aehnlich wie sie auf einem UPN-Taschenrech- 
ner eingegeben wuerde. 


Nun die theoretische Vorgehensweise zur Berechnung dieser 
Funktion (das Argument "X" befindet sich in FAC): 


"X" muss quadriert werden, also wird FAC in ARG kopiert und 
dann FAC mit ARG multipliziert, Ergebnis bereits in FAC. 


Dieses Ergebnis muss nun von der Zahl "]" subtrahiert wer- 
den. Dazu wird die Konstante "1" in ARG wuebertragen, davon 
wird FAC, der das Ergebnis der vorherigen Operation ent- 
haelt, subtrahiert. 


Daraus wird die Wurzel gezogen, was einfach durch Aufruf der 
"SQR"-Routine erfolgen kann. Nun muss das in FAC abgelegte 
Zwischenergebnis durch "X", also das urspruengliche Argu- 
ment, geteilt werden. Da dieses Argument aber mittlerweile 
nicht mehr verfuegbar ist, muss es also zu Beginn des Ma- 
schinenprogramms in einen Bereich webertragen werden, der 
durch keine bis hierhin verwendete Berechnung ueberschrieben 
wird. Dieses gerettete Argument wird sodann in ARG uebertra- 
gen und die Divisionsroutine aufgerufen. 


Zum Abschluss erfolgt ein Sprung zur "ATN"-Routine, die dann 
noch den Arcustangens in FAC bringt. Da das Endergebnis ei- 
ner Funktion sich in FAC befinden muss, ist keine weitere 
Behandlung des Ergebnis der "ATN"-Routine mehr noetig. 


21 


Hier nun das Maschinenprogramm zur Ausfuehrung der Berech- 
nung: 


828 LDX #0 (XR/YR) := 256 

830 LDY # 

832 JSR 48084 > FAC nach 256 bis 260 retten 

835 JISR 48140 > FAC nach ARG uebertragen 

838 LDA 97 Exponentbyte in Accu fuer Nullpruefung 
840 JSR 47659 > FAC := ARG * FAC 

843 LDA #188 (Accu/YR) := 47548 

845 LDY #185 Startadresse der Konstanten "1" 

848 JSR 47184 ) FAC := Konstante / FAC 

851 JSR 49009 > FAC := SQR (FAC) 

854 LDA #0 (Accu/YR) := 256 

856 LDY #1 Startadresse des geretteten Arguments 
858 JSR 47887 > FAC := Konstante / FAC 

861 JMP 58126 > FAC := ATN (FAC) 


Das zugehoerige BASIC-Programm zum Einlesen der Maschinen- 
routine: 


100 FOR I = 828 TO 862 : READ A : POKE I, A : NEXT 

110 POKE 785, 60 : POKE 786, 3 

120 DATA 162, , 160, 1, 32, 212, 187, 32, 12, 188, 165, 97 
130 DATA 32, 43, 186, 169, 188, 160, 185, 32, 80, 184, 32 
140 DATA 113, 191, 169, , 160, 1, 32, 15, 187, 76, 14, 227 


Vielleicht ist es Ihnen aufgefallen, dass nicht der Typ des 
Arguments geprueft wurde. Dieser kann durch den Inhalt der 
Adresse 13 (siehe Memory Map) oder durch Aufruf der entspre- 
chenden Routine zur Pruefung des Ausdrucktyps festgestellt 
verden. Dies ist jedoch nicht noetig, da die Adresse )3 
durch Berechnungen nicht geaendert wird. Daher ist nach Be- 
endigung der Berechnung diese Flag im Falle eines Stringar- 
guments noch immer auf "String" gesetzt. Da jedoch bei die- 
ser Funktion ein numerisches Ergebnis erwartet wird, erfolgt 
die Ausgabe von "?TYPE MISMATCH ERROR", falls ein Stringar- 
gument mitgegeben wurde. 


Hat eine Funktion ein Ergebnis des Typs String, so muss an- 
ders vorgegangen werden, da eine direkte Rueckkehr zur auf- 
rufenden Auswertungsroutine mittels "RTS" nur bei numeri- 
schem Resultat erfolgen darf. Zuerst muss fuer den Ergebnis- 
string der Funktion Platz im Arbeitsspeicher geschaffen vwer- 
den. Zu diesem Zeitpunkt muss die Laenge des Ergebnisstrings 
bekannt sein, da bei Aufruf der Routine 46205 der Accu die 
Laenge enthalten muss. Entsprechend dieser Angabe wird dann 
Platz im Arbeitsspeicher geschaffen. Registerpaar (98/99) 
zeigt dann auf die Startadresse dieses Bereichs. Ist alles 
abgespeichert worden, so muss nun die Ruecksprungadresse in 
die Auswertungsschleife mittels "PLA", "PLA" vom Stack ge- 
holt werden. Durch "JMP 46282" wird dann der Descriptor :des 
im oberen Stringbereich abgelegten Strings in die Descrip- 
tortabelle gebracht. Ein verstaendliches Beispiel fuer die- 
ses Prinzip ist die Funktion "CHR$" ab der Adresse 46828. 


22 


STEUERCODES FUER DEN COMMODORE 64 


000: - 128: - 

001: - 129: ORANGE: Cursorfarbe orange 
002: - 130: - 

C03: RUNSTOP 131: Shift RUNSTOP 

004: - 132: - 

005: WHITE: Cursorfarbe weiss 133; Fl Codes fuer die 

006: - 134: F3 Funktionstasten 

007: - 135: F5 

008: Shift + Commodore blockieren 136: F7 

009: Shift + Commodore freigeben 137: F2 

010: - 138: F4 

Oll: - 139: F6 

0l2: - 140: FB 

013: RETURN 141: Shift RETURN 

014: Gross- und Kleinschrift 142: Grossschrift und Graphik 

015: - 143: - 

016: - 144: BLACK: Cursorfarbe schwarz 
017: CURSOR DOWN: Cursor nach unten 145: CURSOR UP: Cursor nach oben 
018: REVERS DON: Negativdruck 146: REVERS OFF: Positivdruck 

019: HOME: Cursor nach oben links 147: CLEAR SCREEN: Bildschirm loeschen 
020: DELETE: Zeichen loeschen 148: INSERT: Zeichen einfuegen 

021: - 149: BROWN: Cursorfarbe braun 

022: - 150: LT. RED: Cursorfarbe rosa 

023: - 151: GRAY 1: Cursorfarbe dunkelgrau 
024: - 152: GRAY 2: Cursorfarbe mittelgrau 
025: - 153: LT. GREEN: ”’Cursorfarbe hellgruen 
026: - 154: LT. BLUE: Cursorfarbe hellblau 
027: - 155: GRAY 3: Cursorfarbe hellgrau 
028: RED: Cursorfarbe rot 156: PURPLE: Cursorfarbe purpur 
029: CURSOR RIGHT: Cursor nach rechts 157: CURSOR LEFT: Cursor nach links 
030: GREEN: Cursorfarbe gruen 158: YELLOW: Cursorfarbe gelb 

031: BLUE: Cursorfarbe blau 159: CYAN: Cursorfarbe cyan 
Nichtaufgefuehrte Codes haben in der Standardversion des Betriebssystems 


keinerlei Wirkung. 


Saemtliche angegeben Steuercodes sind ueber die CHR$-Funktion sowie, von 142 
abgesehen, auch ueber die Tastatur erreichbar. 


Die Codes 013, 131, lM41 und im Normalfall auch 020 und 148 werden immer 
ausgefuehrt und bewirken keine Ausgabe von Steuersymbolen. Sie sollten bei 
verwendung in Programmen daher ueber der CHR$-Funktion programmiert werden. 


Die Codes 003, 131 sowie 133 bis 140 (Funktionstasten) haben bei der Ausgabe 
keinerlei Funktion und finden daher im Normalfall wohl nur zur Abfrage der 
Tasten Verwendäng. Lediglich der Code 13] hat ueber die Programmierung des 
Tastaturpuffers die Funktion, die er auch im Normalfall hat, das Einladen und 
Starten von Cassettenprogrammen. 


Die Codes von 000 bis 031 sind unter anderem auch durch Druecken der 
Control-Taste zusammen mit einer der Tasten von "WW", "A" bis "zZ", ":",  *"Pound', 
„,;", "&" und "=" erreichbar, es gelten jedoch auch hier die oben gemachten Ein- 
schraenkungen. 


23 


STELERCODES IN LISTINGS 


Waehrend zich heim FET 2001 die Anzahl der Steuercades mach 
im Rahmen hielt, sc sikt es keim Commadore 854 schan insge- 
samt 42 Codes, die irgendeine Bedeutung haken. Besonders 
keim Eintippen von Listings ist es notwendig. das Steuerzei- 
chen mit der Taste (die diesen [ode erzeugt) in Verkindung 
zu krinrgen. Deshalk eine Aufstelluna aller »erwendeten Steu- 
erccdes: Es wird jeweils das pasitive zum besseren Erken- 
nen» und das neastive Zeichen “dss in den Listings vorkommt)» 
ansgegeker. Ruch werden keide Darstellunasmodi Graphik und 
Kleinschrift> beruecksichtist: 


-— RUNSTOP 

-— Control E- 
— Contrcl H 

— Control I. 
Control N 

- Control D, CURSOR DOuN 

- Control R., Control 93 

—-— Control S. HOME 

-— DELETE. CHF$i\ 20) 

- Control £. Cantrol 23 

—-— Cantraoal :, CURSOR RIGHT 
- Cantrcal  - Control & 

- Control =, Control 7 

- Commodore 1 

-— Shift-RUNSTOP 

- Fi 

- F3 

- FS 

- F7 

- F2 

- Fa 

- Fö 

- FS3 

CHR$U142) 

- Control 1 

— CURSOR UP 

- Control 8 

— CLEAR SCREEN 

— INSERT. CHR$ 1485 

- Commodore 
—- Commodore 
- Commodore 
—-— Lommadeore 
- Commodare 
- Commodore 
- Commodore 
- Control 5 
- CURSOR LEFT 
- Control 3 

-— Control 4 


Central 2 


Es U nd 29 ed u Bu Li [al 
| 


+Nn I2I3I-Fon 


IIStrt>u AWO ZITIMN 
I > 


« 


 ) 


r 


[ 
“ 


“._ 
ANIO TDTZTFTR“MHM TOTNTMNID 


WE Ge ee a [ee En Di Isa Ei Ina ma ia iz ER En = I a an I bi 
| 


u 


KE< 


N- 


BR, 
 FDBSEUBSSEU AMELIE EN EEE u IE I BR EI bi ED a ei ee Du Be I I 
DNS Bw m 


A3—- "HR _LIUNX- 


De 
PR 


24 


EINFUEHRUNG IN DIE ASSEMBLER-PROGRAMMIERUNG 


Das "Herz" eines jeden Mikrocomputers ist der Mikroprozes- 
sor. Im VIC 20 ist ein Mikroprozessor des Typs "6502" einge- 
baut, im Commodore 64 ein "6510". Beide sind bezueglich der 
Programmierung in Assembler voellig identisch. 


Jeder Mikroprozessor kann eine bestimmte Anzahl von genau 
definierten Assembler-Anweisungen verstehen und ausfuehren, 
etwa so, wie ein BASIC-Interpreter bestimmte BASIC-Befehle 
verarbeiten kann. Derjenige, der diese Assembler-Anweisungen 
beherrscht, kann also direkt den Mikroprozessor program- 
mieren. 


Programme, die in Assembler geschrieben sind, laufen wesent- 
lich schneller ab als in BASIC und koennen die Moeglich- 
keiten des Computers viel besser ausnutzen. Fuer jeden fort- 
geschrittenen Programmierer ist daher die Beherrschung der 
Assembler-Sprache unerlaeßlich. 


Um erfolgreich in Assembler programmieren zu koennen, ist es 
wichtig, den Aufbau des Computers zu kennen. 

Jeder Computer besteht aus einer Vielzahl von kleinen 
Schaltern, die entweder offen sind (es fließt kein Strom) 
oder geschlossen (es fließt Strom). Natuerlich handelt es 
sich dabei nicht um mechanische Schalter, sondern vielmehr 
um Schaltelemente, die in IC-Bausteinen ("Chips") unterge- 
bracht sind. Einen solchen einzelnen Schalter nennt man 
"Bit" und statt "offen" und "geschlossen" redet der Fachmann 
von zwei "Zustaenden", die er "0" und "1" nennt. Ein solches 
System heißt "binaer", "zweier Zustaende faehig". 


Der 6502/6510 Mikroprozessor ist derart aufgebaut, daß er 
jeweils 8 Bits gleichzeitig verarbeitet. Eine solche Einheit 
von B Bits nennen wir "Byte". Ein Beispiel fuer ein Byte ist 
"00110101". 


l Byte = (z.B.) 0011071071 
Bit Nummer 65 43 210 


Wie Sie sehen, werden die einzelnen Bits eines Bytes von 
rechts nach links von O0 bis 7 durchnumeriert. 


Nun ist der gesamte Computerspeicher aufgebaut aus einzelnen 
"Speicherzellen", wobei jede Zelle genau ein Byte groß ist. 
Sie koennen sich das ungefaehr so vorstellen: 


Speicherzelle 0: 10101010 = 8 Bit = 1 Byte 
Speicherzelle 1: 01101101 
Speicherzelle 2: 00011001 
Speicherzelle 655335: 01000011 


Die Bytes unterscheiden sich dadurch voneinander, daß sie 
zum Teil unterschiedliche Bitkombinationen (z.B. "01000011") 
enthalten. Man redet auch davon, daß ein Bit "gesetzt" (= ]) 
oder "geloescht (= 0) ist. Die in der Skizze genannten Bit- 
kombinationen sind willkuerlich gewaehlt. 


Da 8 Bits nur 256 verschiedene Kombinationen darstellen 
koennen, kann der Mikroprozessar 6502/6510 grundsaetzlich 
nur Zahlen von 0 bis 255 bearbeiten (s. auch Kapitel 
"Binaerarithmetik"). 


25 


Kombination 0: 0000000 
Kombination 1: 0000001" 
Kombination 2: 00000710 
Kombination 3: 0000011 
Kombination 4: 0000100 
Kombination 255: 1l1ı1l1 111 


Sie sehen, daß jeder Bitkombination, also jedem Byte, ein 
bestimmter dezimaler Wert von O bis 255 zugeordnet ist. Wenn 
Sie z.B. "POKE3,255" eingeben, so bedeutet das nichts 
anderes, als daß in die Speicherzelle 3 die Bitkombination 
"11111111" eingeschrieben wird. 


Der Speicher besteht aus einzelnen Speicherzellen von der 
Groeße eines Bytes, die prinzipiell voellig gleich sind. Wir 
unterscheiden jedoch unterschiedliche Funktionsbereiche wie 
Programm- und Variablenspeicher, Betriebssystem- und BASIC- 
Interpreter-Bereich, Ein-/Ausgabespeicher, Betriebssystem- 
zwischenspeicher u.a. Das vorliegende Buch erlaeutert die 
Arbeitsweise jedes einzelnen Funktionsbereiches im Detail. 
Dabei gibt es sog. "RAM-Speicher" und "ROM-Speicher". "RAM" 
bedeutet, daß Daten eingeschrieben und auch wieder gelesen 
werden koennen (z.B. Programm- und Variablenspeicher), "ROM" 
hingegen meint, daß der betreffende Speicherbereich aus- 
schließlich gelesen, nicht aber durch anderen Daten ueber- 
schrieben (veraendert) werden kann (z.B. BASIC-Interpreter). 


Machen Sie sich klar, daß der gesamte Computerspeicher aus 
einzelnen Speicherzellen besteht, die wiederum Zahlen bein- 
halten. Diese Zahlen haben allerdings ganz verschiedene 
Bedeutungen, es kann sich um ein BASIC-Programm handeln, 
oder um ein Assembler-Programm, oder auch um Daten. 


Sehen wir uns nun - ausgeruestet mit einem Minimum an 
theoretischen Wissen - das erste Assembler-Programm an. Um 
das Programm in den Computer eingeben zu koennen, benoetigen 
wir noch ein sog. "Assembler-System", das unsere Assembler- 
Anweisungen in reinen Zahlencode umsetzt. Sie finden ein 
solches - allerdings sehr einfaches Assembler-System - im 
Anschluß an dieses Kapitel. Es ist sicher sinnvoll, wenn Sie 
sich zunaechst dort mit der Bedienung vertraut machen. Sie 
koennen dann gleich die erklaerten Beispiele nachvollziehen. 


Commodore 64 VC-20 (bis 8K) VC-20 (groeßer BK) 
828 LDA #65 828 LDA #65 828 LDA #65 
830 STA 1024 830 STA 7680 830 STA 4096 
833 LDA #3 833 LDA #3 833 LDA #3 
835 STA 55296 835 STA 38400 835 STA 37888 
838 RTS 838 RTS 838 RTS 


Um das Programm auszuprobieren, geben Sie von BASIC aus SYS 
828 (RETURN) ein. Es sollte sodann ein Zeichen in der linken 
oberen Bildschirmecke zu sehen sein. 
Jeder Assembler-Schritt besteht aus: 

828 LDA #65 


Adresse Assemblerbefehlswort Argument 
("auch Mnemonic") 


26 


Die "Adresse" gibt an, ab welcher Speicherzelle die 
Assembler-Anweisung beginnt. Es existieren insgesamt 65536 
verschiedene Speicherzellen, die die Adressen von 0 bis 
65535 tragen. Jede Assembler-Anweisung belegt je nach Befehl 
l bis 3 Bytes. Der Adresse folgt das eigentliche Assembler- 
Befehlswort, im Beispiel "LDA". Sie finden in diesem Buch 
ein Verzeichnis aller gqueltigen Befehlsworte. Dem Befehls- 
wort kann - je nach Befehl - noch ein Argument folgen, in 
unserem Beispiel "Doppelkreuz 65". Es gibt auch Assembler- 
Anweisungen ohne Argument. Schließlich existieren ja auch in 
BASIC Befehle mit und ohne Argument (z.B. POKE mit zwei 
Argumenten, STOP ohne Argument). 


Das Befehlswort "LDA" steht fuer "load accumulator", "Lade 
Akkumulator", oder in diesem Fall "Lade Akkumulator mit dem 
Wert 65". "STA" bedeutet "store accumulator", "speichere 


Akkumulator an der angegebenen Adresse ab". 


Um das verstehen zu koennen, muessen Sie wissen, daß es in 
Assembler im Unterschied zu BASIC keine Variablen gibt. Als 
Ersatz dafuer existieren in Asembler drei "Register", 
naemlich "Akkumulator", "X-Register" und "Y-Register". Ein 
solches Register kann Werte von 0 bis 255 beinhalten. Jetzt 
koennen Sie das Programm verstehen (beispielhaft fuer den 
Commodore 64): 


828 LDA #65 ;sAkkumulator mit dem Wert 65 laden 

830 STA 1024 ;sdiese 65 in Speicherzelle 1024 speichern 
833 LDA #3 sAkkumulator mit dem Wert 3 laden und 

835 STA 55296 sdie 3 in Speicherzelle 55296 speichern 
838 RTS ;sbeendet jedes Assembler-Programm 


Beachten Sie die Bedeutung des Doppelkreuz-Zeichens: Der 
Akkumulator wird direkt mit dem Wert 65 geladen (und nicht 
mit dem Wert, der in der Speicherzelle 65 steht, was auch 
moeglich waere). Hingegen wird diese 65 dann in Speicher- 
zelle 1024 abgespeichert. Die Anweisung RTS ("return from 
subroutine", "Rueckkehr aus einer Unterroutine") muß unbe- 
dingt am Ende jedes Assemblerprogramms stehen. Andernfalls 
geraet der Computer im allgemeinen in einen voellig wunkon- 
trollierten Zustand ("Absturz"), da er versucht, weitere An- 
weisungen auszufuehren, obwohl kein gueltiger Assemblercode 
mehr vorhanden ist. 


Warum unser Programm ein Zeichen auf dem Bildschirm ausgibt? 
Nun, Speicherzelle 1024 (Commodore 64) entspricht der linken 
oberen Bildschirmposition (Zeichencode), Speicherzelle 55296 
bestimmt die Farbe eben dieser Position. Experimentieren Sie 
selbstaendig in dieser Richtung, indem Sie statt 65 andere 
Werte zwischen O0 und 255 nehmen, statt der 3 andere Werte 
von O bis 7 (VIC 20) bzw. von O bis 15 (Commodore 64). 


Assembler BASIC 
828 LDA #65 828 A = 65 
830 STA 1024 830 POKE 1024, A 
833 LDA #3 833A= 3 
835 STA 55296 835 POKE 55296, A 
838 RTS 838 END 
Natuerlich existieren in Assembler noch eine Vielzahl 


anderer Befehlsworte. Ein Teil davon ist den bereits 
gelernten so aehnlich, daß Sie sie sofort verstehen werden. 


27 


Fuer das X- und Y-Register lauten die Befehlsworte zum Laden 
und Abspeichern wie folgt: 


Assembler Funktion BASIC-Entsprechung 
LDX #wert laedt X-Register X = wert 
STX adresse speichert X-Register POKE adresse, X 
LDY #wert laedt Y-Register Y= wert 
STY adresse speichert Y-Register POKE adresse, Y 

X- und Y-Register sind - genau wie der Akkumulator - interne 


Register des Mikroprozessors von der Groeße eines Bytes. Sie 
koennen also Zahlen von O bis 255 enthalten. 


Um einen Text auf dem Bildschirm auszugeben, wird dieser 
einfach Zeichen fuer Zeichen mit LD? (LDA, LDX oder LDY) in 
ein Register geladen und mit ST? an die entsprechende 
Bildschirmposition gebracht. Außerdem muß die korrespon- 
dierende Speicherzelle des Farbspeichers mit einem Farbwert 
versehen werden (s. auch Kapitel "Bildschirmspeicher" und 
"Farbspeicher"). 


Weitere wichtige Assembler-Befehle in Bezug auf die Prozes- 
sorregister sind Anweisungen zum Erhoehen und Erniedrigen 
der Register: 


Assembler Funktion BASIC-Entsprechung 
INX erhoeht X-Reg. um eins X=X+]1 
DEX erniedrigt X-Reg. um eins X=X-] 
INY erhoeht Y-Reg. um eins Y=Y+]l 
DEY srniedrigt Y-Reg. um eins Y=Y-]l 


Diese Anweisungen benoetigen kein Argument. Ein entsprechen- 
der Befehl zum Inkrementieren oder Dekrementieren des Akku- 
mulators existiert nicht. Hingegen gibt es die Moeglichkeit, 
einzelne Speicherzellen direkt um eins zu erhoehen oder zu 
erniedrigen. 


Assembler BASIC-Entsprechung 
INC adresse POKE adresse, PEEK(adresse) + 1 
. DEC adresse POKE adresse, PEEK(adresse) - 1] 


Ein Beispielprogramm soll Ihnen die Moeglichkeiten der In- 
krement/Dekrement-Anweisungen verdeutlichen (Commodore 64): 


Assembler Funktion BASIC-Entsprechung 
830 LDX #0 ;Schleifenzaehler 830X=0 

832 LDA #42 ;sZeichencode "*" 832 A = 42 

834 STA 1024,X ;Bildschirmspeicher 834 POKE 1024+X,A 

837 LDA #3 ;Farbzahl 837 A=3 

839 STA 55296,X ;Farbspeicher 839 POKE 55296+X,A 
842 INX ;X-Reg. von O0 bis 8422 X=X +1 

843 CPX #50 ;50 zaehlen und 

845 BNE 832 ;Sprung zu 832 845 IFX 5O0THENB32 
847 RTS ;Programmende 847 END 


Anpassung fuer VIC 20: bis 8K: 7680 statt 1024, 38400 statt 
55296; ueber 8K: 4096 statt 1024, 37888 statt 55296. Geben 
Sie das Programm ein und starten Sie es mit SYS 830. Es 
sollten 50 farbige Sternchen zu sehen sein. 


28 


Experimentieren Sie selbstaendig: Ersetzen Sie einmal die 42 
durch andere Werte von OD bis 255, die 3 durch andere Werte 
von O0 bis 7 (VIC 20) bzw. von O bis 15 (Commodore 64), die 
50 durch andere Werte von OD bis 255. 


Zur Erklaerung: Mit Hilfe des X-Registers wird eine Schleife 
programmiert, die von DO bis 50 zaehlt. INX bewirkt jeweils 
die Erhoehung um eins. "CPX" steht dabei fuer "compare x- 
register", "vergleiche X-Register", in diesem fall mit 50. 
Darauf folgt die BNE-Anweisung. "BNE" bedeutet "branch on 
not equal", "verzweige bei Ungleichheit". Mit anderen Wor-: 
ten: Solange das X-Register noch nicht gleich 50 ist, wird 
zu Adresse 832 zurueckgesprungen. CPX und BNE hintereinander 
entsprechen in BASIC einer IF-THEN-Anweisung (bedingte 
Sprunganweisung mit logischem Vergleich). 


Insgesamt existieren in Assembler drei Vergleichsbefehle: 


Assembler Funktion 

CMP #wert vergleicht Akkumulator mit dem Wert 
CPX #wert vergleicht X-Register mit dem Wert 
CPY #wert vergleicht Y-Register mit dem Wert 


Entsprechungen in BASIC gibt es nicht. Auf jede Vergleichs- 
anweisung folgt ein sog. "Branch-Befehl", in unserem Bei- 
spiel ist das "BNE". Das ist ungefaehr so, wie in BASIC auf 
IF in jedem Fall THEN folgen muß. 


Damit existieren in Assembler die folgenden Moeglichkeiten 
bedingter Sprunganweisungen: 


Sprung bei Gleichheit: CMP #wert 
BEQ adresse 


Sprung bei Ungleichheit: CMP #wert 
BNE adresse 


Sprung bei 'kleiner als': CMP #wert 
BCC adresse 


Sprung bei 'groesser/gleich': CMP #$wert 
BCS adresse 


Wir moechten allerdings an dieser Stelle ausdruecklich 
darauf hinweisen, dass die Erklaerungen im Rahmen dieser 
"Einfuehrung in die Assembler-Programmierung" stark verein- 
facht und keineswegs vollstaendig sind. Ein umfassender 
systematischer Assembler-Kurs wuerde den Rahmen dieses 
Buches sprengen. Allen wirklich Interessierten empfehlen wir 
unseren "6502-Assembler-Kurs fuer Beginner", ISBN 3-88986- 
000-1. Schließlich ist ein Systemhandbuch weder ein BASIC- 
noch ein Assembler-Lehrbuch. 


Soll ein Sprung unabhaengig von irgendwelchen Bedingungen 
erfolgen, so wird dies in Assembler mit dem Befehlen JMP 
(normaler Sprung) oder JSR (Unterprogrammsprung) erreicht. 
"JMP" steht fuer "jump", "Sprung", "JSR" bedeutet "jump to 
subroutine", "Sprung zu Unterprogramm". 


Assembler Funktion BASIC-Entsprechung 
JMP adresse Sprung GOTO zeilennummer 
JSR adresse Unterprogrammsprung GOSUB zeilennummer 


29 


Die Rueckkehr aus einem Unterprogramm erfolgt mittels RTS, 
"return from subroutine". 


Assembler Funktion BASIC-Entsprechung 
RTS Ruecksprung aus RETURN 
Unterprogramm 


Es wird Ihnen auffallen, daß dies derselbe Befehl ist, mit 
dem jedes Assembler-Programm enden muß. Der Grund dafuer ist 
recht einfach: Von BASIC aus wird jedes Assembler-Programm 
als Unterprogramm aufgerufen (SYS, USR), folglich muß es 
auch wie ein Unterprogramm abgeschlossen werden. 


Wie Sie bereits wissen, gibt es drei Arbeitsregister in der 
CPU 6502/6510: Akkumulator sowie X- und Y-Register. Der 
Transfer von Daten zwischen diesen Registern erfolgt mit den 
folgenden Anweisungen: 


Assembler Funktion: BASIC-Entsprechung 
transferiert... 

TAX Akku nach X-Register x = A 

TAY Akku nach Y-Register vV=A 

TXA X-Register nach Akku A=X 

TYA Y-Register nach Akku A=Y 


Beispiel: Im Rahmen eines groesseren Programmes sollen Akku- 
mulator sowie X- und Y-Register mit dem Wert der Speicher- 
zelle 900 geladen werden (Adressen/Zeilennummern wurden weg- 
gelassen): 


Assembler BASIC 
LDA 900 A = PEEK(900) 
TAX X=A 
TAY Y=A 


Beachten Sie, daß diesmal LDA ohne Doppelkreuz verwendet 
wird, da hier nicht der Wert 900 gemeint ist, sondern die 
Speicherzelle mit der Adresse 900. 


Zwei weitere wichtige Befehle zum Addieren und Subtrahieren 
in Assembler sollten Sie noch kennenlernen. Die Befehlswor- 
te lauten "ADC", "add with carry", "Addiere mit Uebertrag" 
und "SBC", "subtract with carry", "Subtrahiere mit Ueber- 
trag". Wichtig in diesem Zusammenhang ist das sog. "Carry- 
Bit" oder "Carry-Flag" zur Bestimmung des Uebertrages (Zum 
Begriff "Flag" s. auch Kapitel "Binaerarithmetik"). Der Vor- 
gang ist im Grunde recht einfach: Der Mikroprozessor 6502/ 
6510 kann - wie Sie wissen - nur Zahlen von O bis 255 verar- 
beiten. Daher muß vor jeder Addition das Carry-Bit ge- 
loescht (= 0) werden. Dann werden die beiden Zahlen addiert 
und ist das Ergebnis groesser als 255, so wird das Carry-Bit 
gesetzt (= 1), andernfalls bleibt es geloescht. 


828 LDA #24 ;laedt Akku mit dem Wert 24 

830 CLC sloescht Carry-Bit (CLC, "clear carry") 
831 ADC #68 saddiert den Wert 68 zu dem Wert 24 

833 STA 850 ;speichert Ergebnis (92) nach Adresse 850 
836 RTS ;Programmende 


Das Ergebnis der Addition kann von BASIC aus mit ?PEEK(850) 
abgefragt werden; gestartet wird das Programm mit SYS 828. 


30 


Die Subtraktion wird in Assembler aehnlich programmiert, nur 
darf dabei das Carry-Bit vorher nicht geloescht, sondern 
muss im Gegenteil gesetzt werden: 


828 LDA #128 ;laedt Akku mit dem Wert 128 

830 SEC ;ssetzt Carry-Bit (SEC, "set carry") 

831 SBC #6 ;ssubtrahiert den Wert 6 von 128 

833 STA 850 ;speichert Ergebnis(122) nach Adresse 850 
836 RTS ;Programmende 


Ist das Ergebnis der Subtraktion im "normalen" Bereich von OD 
bis 255, so bleibt das Carry-Bit unveraendert gesetzt, 
andernfalls wird es geloescht. 


Mit BCC und BCS laeßt sich der Zustand des Carry-Bits fest- 
stellen. "BCC" bedeutet "branch on carry clear", "Sprung bei 
geloeschtem Carry-Bit", "BCS" hingegen "branch on carry 
set", "Sprung bei gesetztem Carry-Bit". Sie kennen die An- 
weisungen BCEC und BCS bereits aus dem Zusammenhang "Bedingte 
Sprunganweisungen". 


828 LDA #128 ;laedt Akku mit dem Wert 128 

830 CLC ;ssetzt Carry-Bit (SEC, "set carry") 

831 ADC #200 saddiert den Wert 200 zu dem Wert 128 
833 BCS 838 ;Sprung nach 838, wenn Carry-Bit gesetzt 
835 STA 850 ;speichert Ergebnis nach Adresse 850 

838 RTS ;Programmende 


In diesem Beispiel wird das Ergebnis nur dann in Speicher- 
zelle 850 abgespeichert, wenn es im zulaessigen Bereich von 
0 bis 255 liegt. Andernfalls wird durch die Addition mit ADC 
das Carry-Bit gesetzt (Ueberlauf) und die danach folgende 
BCS-Anweisung verzweigt den Programmablauf zu Adresse 838, 
die STA-Anweisung bei 835 wird also uwebersprungen. Der Wert 
in Speicherzelle 850 bleibt in diesem Fall unveraendert. Mit 
den Beispielwerten 128 und 200 wird dies natuerlich immer 
der Fall sein - schliesslich ist 328 ja groesser als 255. 
Probieren Sie einmal andere Werte aus. 


Außer dem Carry-Bit oder Carry-Flag - auch "C-Flag" - gibt 
es noch sechs andere sog. "Statusbits" oder "Statusflags". 
Alle sieben Statusbits sind im Prozessor zusammengefasst im 
"Prozessor-Statusregister". Das achte Bit dieses Registers 
wird nicht genutzt. Im einzelnen heissen die Status-Bits: 


negativ result (negatives Ergebnis) 
overflow (Vorzeichen-Ueberlauf) 

break command (Break-Befehl) 

decimal mode (Dezimalbetrieb) 
interrupt disable (Interrupt sperren) 
zero result (Null-Ergebnis) 

Carry 


DNTODOD<Z 


Es wuerde den Rahmen dieses Einfuehrungskurses sprengen, 
wollten wir alle Flags erklaeren. Die zwei am haeufigsten 
anzutreffenden sind N- und Z-Flag. 

Das Z-Flag wird immer dann vom Prozessor selbst gesetzt, 
wenn das Ergebnis des direkt vorausgegangenen Befehls Null 
ist. Andernfalls wird das Z-Flag geloescht. Ausschnitt aus 
einem groesseren Programm: 


;laedt Akku mit dem Inhalt von Speicher- 


900 LDA 1024 ‚zelle (Adresse) 1024 
903 BEQ 920 ;Sprung zu 920, wenn Akkuinhalt gleich 0 


31 


BEQ fragt das Z-Flag ab und bewirkt einen Sprung zu der 
angegebenen Adresse (920), wenn es gesetzt ist. Das wiederum 
haengt davon ab, ob das Ergebnis der LDA-Operation Null ist 
oder nicht. BNE ist das Gegenstueck zu BEQ; bei BNE erfolgt 
der Sprung dann, wenn das Z-Flag geloescht ist. Sie haben 
BEQ und BNE bereits im Zusammenhang mit Vergleichsanwei- 
sungen kennengelernt. 


Hier die Befehle zur Abfrage des Prozessor-Statusregisters: 


BCC - Sprung bei geloschtem Carry-Flag 
BCS - Sprung bei gesetztem Carry-Flag 
BEQ - Sprung bei gesetztem Z-Flag 

BNE - Sprung bei geloeschtem Z-Flag 
BMI - Sprung bei gesetztem N-Flag 

BPL - Sprung bei geloeschtem N-Flag 
BVC - Sprung bei geloeschtem V-Flag 
BVS - Sprung bei gesetztem V-Flag 


Zum Abschluß wollen wir uns jetzt noch ansehen, wie eigent- 
lich Assembler-Programme im Speicher abgelegt werden. Das 
ist naemlich fuer das Grundverstaendnis der Programmierung 
in Assembler recht wichtig. 


Der Mikroprozessor ist prinzipiell nur in der Lage, Zahlen 
zu verarbeiten. Er muß sowohl Daten als auch Steueranwei- 
sungen als Zahlen erhalten. Deswegen wird jedes Assembler- 
Programm als eine Folge von Zahlen abgespeichert. Wenn Sie 
Assembler-Text wie "LDA, "STX" etc. eingeben, so sorgt das 
betreffende Assembler-System dafuer, dass dieser Text bei 
Druecken der RETURN-Taste sofort in eine entsprechende 
Zahlenfolge zerlegt und abgespeichert wird. Daher ist zur 
Assembler-Programmierung immer auch ein Assembler-System 
notwendig - egal, ob Sie nun das in diesem Buch abgedruckte 
einfache System oder ein so komplexes Assembler-System wie 


'T.EX.AS.' - "Terminal Extended Assembler" - benutzen. 
Assemblertext Zahlencode 
828 LDA #65 169 65 
830 STA 1024 141 0 4 
833 LDA #3 169 3 
835 STA 55296 141 0 216 
838 RTS 96 


Das Programm steht wie folgt im Speicher: 


Adresse Inhalt (dezimal) Bedeutung 
828 169 LDA # 
829 65 Argument zu LDA # 
830 141 STA 
831 0 l. Teilargument zu STA 
832 4 2. Teilargument zu STA 
833 169 LDA # 
834 3 Argument zu LDA # 
835 141 STA 
836 0 l. Teilargument zu STA 
837 216 2. Teilargument zu STA 
838 96 RTS 

Die Zerlegung einer Zahl in zwei Teilzahlen - genannt LSB 


(1. Teilzahl) und MSB (2. Teilzahl) - erfolgt so: 


Gesamtzahl = LSB + 256 x MSB 


32 


Beispiel: 1048 geteilt durch 256 ergibt 4,09375. 4 mal 256 
ist gleich 1024. 1048 minus 1024 ergibt 24. Also ist das MSB 


gleich 4 und das LSB gleich 24. Denn: 
1024 — 24 + 256 x 4 


Die Zerlegung einer Zahl in zwei Teilzahlen ist notwendig, 
da eine Speicherzelle nur Zahlen von 0 bis 255 aufnehmen 
kann. Groessere Zahlen werden in zwei aufeinanderfolgenden 
Speicherzellen eben in zwei Teilzahlen als LSB und MSB dar- 
gestellt. "LSB" bedeutet "least significant byte", "nieder- 
wertiges Byte", "MSB" steht fuer "most significant byte", 
"hoeherwertiges Byte" (s. auch Kapitel "Binaerarithmetik"). 


Die Zuordnung der Assembler-Befehlsworte zu Zahlen ist stan- 
dardmaessig festgelegt (STA ist gleich 141 usw.). Neben dem 
Befehlswort spielt dabei auch die "Adressierungsart" eine 
Rolle. Sie haben bereits folgende Adressierungsarten kennen- 
gelernt: 


unmittelbar LDA #wert 
absolut LDA adresse 
STA adresse 
LDX adresse 
STX adresse 
LDY adresse 
STY adresse 
JMP adresse 
USW. 
implizit INX 
DEX 
INY 
DEY 
RTS 
USW. 
indiziert STA adresse,X 
STA adresse,Y 
USW. 


Insgesamt gibt es in Assembler 13 verschiedene Adressie- 
rungsarten. Die Zuordnung aller Assembler-Befehlsworte in 
den moeglichen Adressierungsarten zu den entsprechenden Zah- 
lencodes finden Sie in diesem Buch in der Tabelle "Adressie- 
rungsarten". 


Damit sind wir am Ende dieses "Assembler-Schnellkurses" an- 
gelangt. Sie sind - falls Sie nicht noch andere Literatur zu 
Rate gezogen haben - jetzt weder in der Lage ein komplexeres 


Assembler-Programm zu lesen noch gar eines zu schreiben. 
Aber Sie verstehen genug von Assembler, um erstens zu 
wissen, worum es dabei geht und zweitens sich entscheiden zu 
koennen, ob Sie sich naeher damit befassen moechten. In 
diesem Fall moechten wir Ihnen als ausfuehrliches und leicht 
verstaendliches Lehrbuch nochmals den "6502-Assemblerkurs 
fuer Beginner", ISBN 3-88986-000-1, empfehlen. Das Buch 
nimmt speziell Bezug auch auf die Computer Commodore 64 und 
vVIC 20. Zur fortgeschrittenen Programmierung in Assembler 
offerieren wir Ihnen unser "'T.EX.AS.' - Assembler Entwick- 
lungs- und Lehrsystem". Wir wuerden uns jedenfalls freuen, 
Sie in dem einen oder anderen Werk wieder begruessen zu 
koennen. INTERFACE AGE VERLAG GMBH, Vohburgerstr. 1, D-8000 
Muenchen 21, Tel. (089) 5 80 67 02. 


33 


ASSEMBLER UND DISASSEMBLER FUER COMMODORE 64 UND VIC-20 


Um das Erstellen eigener Maschinenprogramme zu vereinfachen, 
ist im folgenden ein einfacher, zum groessten Teil in BASIC 
geschriebener Assembler, abgedruckt. Mit diesem ist es moeg- 
lich, Maschinenprogramme, Bytes und Adressen einzugeben, wo- 
bei der Assembler alle notwendigen Umwandlungen selbst vor- 
nimmt. Auch koennen beliebige Speicherbereiche disassem- 
bliert werden. Hierzu die genaue Anleitung zur Handhabung 
dieses Assemblers: 


Beim Eintippen des Assemblers muss ganz besonders auf die 
korrekte Eingabe der DATA-Zeilen geachtet werden. Daher wird 
empfohlen, den gesamten Text nach der Eingabe noch einmal zu 
kontrollieren. Auch sollte man den Assembler vor dem ersten 
Start durch "RUN" erst einmal auf Cassette oder Disc abspei- 
chern, um sich ein zweites. Eintippen im Falle eines "Abstur- 
zes" zu ersparen. 


Ist der Assembler durch "RUN" gestartet worden, so muss sich 
nach einigen Sekunden der Computer mit einem blinkenden Cur- 
sor melden. Nun ist der Assembler eingabebereit und erwartet 
Ihre Anweisungen. 


Jede Eingabezeile MUSS mit einer Adresse im Bereich von 0 
bis 65535 beginnen. Bei folgender Eingabe eines Maschinenbe- 
fehls ist dies die Adresse, ab der der Befehl (gegebenen- 
falls mit Argument) abgelegt werden soll. So zum Beispiel 
bei Eingabe des folgenden Beispielprogramms fuer den 64er: 


828 LDX #0 

830 LDA 646 

833 STA 55296,X 
836 TXA 

837 STA 1024,X 
840 INX 

841 BNE 830 

843 RTS 


Wie Sie sicher bemerken, wird automatisch die naechste 
Adresse nach dem eingegebenen Befehl vorgegeben, aehnlich 
einem Autonumber fuer BASIC. Auch muss bei Verzweigungsbe- 
fehlen nicht der Offset angegeben werden, sondern die Abso- 
lutadresse. 


Entsprechend erfolgt die Eingabe von Bytes und Adressen. Auf 
die Adresse folgt das Byte beziehungsweise die Adresse, die 
an der angegebenen Adresse abgelegt werden soll. So ent- 
spricht ... 


650 128 . 


dem Befehl "POKE 650, 128". Fuer die Eingabe von Adres- 
sen existiert kein gleichvertiger Befehl im Commodore-BASIC, 
lediglich EXBASIC besitzt den Befehl "DOKE". So koennte von 
EXBASIC aus statt ... 


785 828 


... auch geschrieben werden "DOKE 785, 828" oder in diesem 
Fall "DEF USR = 828". Soll ein Wert im Bereich von O bis 255 
als Pointer abgelegt werden, so muss vor den Wert der Klam- 
meraffe "®" gesetzt werden, um dem Computer zu zeigen, dass 
es sich um einen 16-Bit-Wert handelt. 


34 


Fuer die Ausgabe von Speicherinhalten stehen. drei Befehle 
zur Auswahl: "D" fuer Daten in Form von Bytes, "A" fuer 
Adressen und "L" fuer Assemblertext. Die Syntax fuer alle 
diese Befehle ist gleich: 


Startadresse Befehl (Endadresse) 


Um den Speicherbereich von 41866 bis 41900 zu disassemblie- 
ren, muss eingegeben werden ... 


41866 L 41900 


Leerzeichen koennen, ausser bei der Eingabe von Bytes und 
Adressen (zur Trennung der Zahlen) entfallen. 


Das Verlassen des Assembler erfolgt durch das Kommando "X", 
wobei auch hier eine Zahl vor dem Buchstaben stehen muss 
(die allerdings keine Bedeutung hat). 

Hinweise fuer VIC-20 

Fuer den VIC-20 wird mindestens eine Erweiterung um 3 KB be- 
noetigt, um mit dem Assembler arbeiten zu koennen. Da jedoch 
beim VIC-20 kein freier Bereich fuer das Maschinenprogramm 
zur Verfuegung steht, muss der Anfang des BASIC-Bereichs 
verlegt werden. Dies muss VOR der Eingabe des Listings sowie 
VOR dem Einladen geschehen. 

VICs mit INSGESAMT 8 KB, also mit 3-KB-Erweiterung: 
Verlagerung des BASIC-Anfangs: 

POKE 44, 5 : POKE 1280, O 


Programmaenderungen (Position im Listing unterstrichen): 


110 FORI=1025101240:... 120 SYS1117:... 
470 DATA...11,4... 490 DATA...11,4... 


Aufhebung der Verlagerung: 

POKE 44, 4 : NEW 

VICs mit MEHR ALS 8 KB, also mit B oder 16-KB-Erweiterung: 
Verlagerung des BASIC-Anfangs: 

POKE 44, 19 : POKE 4608, O 

Programmaenderungen (Position im Listing unterstrichen): 


110 FORI=4609T04824:... 120 SYS4701:... 
470 DATA...11,18... 490 DATA...11,18... 


Aufhebung der Verlagerung: 

POKE 44, 18 : NEW 

Die Aufhebung der Verlagerung ist notwendig, wenn andere 
Programme geladen werden sollen oder BASIC programmiert ver- 


den soll. 


Ausserdem muss bei allen VICs vor den Befehl "SPpC(20)" in 
Zeile 370 der Leerstring ("") gesetzt werden. 


35 


RSS5EIMBLER FUER COmrMmMODORE &4 


198 
ı11a 
120 
13a 
140 
150 
169 
ıra 
1808 
120 
zu 
21a 
220 
230 
2408 
238 
260 
era 
23a 
29a 
384 
3ıa 
320 
338 
340 
358 
360 
ara 
3838 
330 
a0 
418 
420 
438 
440 
+50 
460 
470 
4230 
430 
Sag 
s1a 
s2a 
538 
4 
ssa 
Sssa 
Sva 
384 
Ss98 
sad 
si 
820 
830 
40 
850 
sea 


AF="":B$="":1=. :J=. ıfl=. ıP=. 10=. :B=. ıh=. :DEFFNDGT5=PEERSITY+2SSHPEEKCI+1> 
FORI=-S3932T053247 :RERODIA :POKEI .R=NEXT: DIMB$«25S> :FORI=. TO131 :READB$CI> :HEX 
SYSS3124 1A$=A$+"" :IFA$=""GOTO12A 

R=FND« 2537 :P=FNOD<2515 :1I=. :IFLEN{A$IF2ZGOTOSBE 

B=RASCER$> : IFB=91 THENPOKER..P :P=A:G0OTO1ra 

IFB=33THENPOKER „PEEKK 2515 sPOKER+1 „FPEERN 2525 :P=A:GOTO190 

IFB-S8SGOTO1SQ 

GOSUBFSTA:RB=1 :Q=PEEK AD :GOSUBFSA SPRINT :ONFGOTO1Y79:GOTO230 

IFB-ESGOTOZaa 

GOSUBISTA :B=2 :Q=FNDE AD :GOSUBFIR SPRINT :ONFGOTO19G:GOTOZIE 

IFB-F&ETHENON- “BIISSPGOTCO1 28 :END :GOTO1206 

GOSUB37O : I=SPEEK«KA> SIFI-4#INTX 174 >=. VSTHENI=Z 

A$=B$ IK. 75+. 755 :PRINTLEFTSECA$,3)" "r:B=2:1IFLENER$S=ITHENB=1:6G0TO2S0 
FORI=4TOLEN“A$> :BS=MIDSEA$.I.19 :IFBS="L" THENO=PEERCR+1> SGOSUB3EA :GOTOZTFA 
IF IANDS1>=18 THENPOKE 144 .„PEEKÜR+13 :0=ST+R+2 :G0OSUB3EB :GOTOZ7R 

IFB$=" 3" THENG=FNOXRA+1D :B=3 :GOSUB3EU :GOTOZTA 

FRINTB$; 

NET 

PRINT :GOSUB4AG :ONFGOTCZ210 

GOSUBFSG :PRINT"TV' :sFORI=. TOS:POKES3S1+1.29 :NEKT :POKE19S,5:G0T0120 
ON-<B$CT>=AFIGOTO3S1QA: 1[I=1+1 :0ON- 1IL192>GOTO309 :GOTO120 

I=INT< 1733+1:B=3 : IFLEN{A$>=3STHENB=1 :GCTCOI48 
IFMID$S<A$.4.19="L"ORMIDSCA$,S,.19="C" THENB=2 

IFETANDS3S1>=18 THENB=2 :P=P-A-2 sQON- KPÖ - 12SORP>127>GOTO128 :POKE2S1 ,PRND2SS 
POKER,.I:sIFBP1THENPOKER+1 -FPEEKX 2515 Ss IFB=3THENPOKER+2 „PEEK (2525 

P=A:GOTOZ1E 

PRINTMID$SCSTE$CO) ,2> : :RETURN 

POKEZ11,. sOPEN3,3:PRINT#3,SPCK 205 :CLOSES:POKEZIM.. 

PRINTRIGHT$«" "+5TR$ER) .2>" "RSRETURN 

PRINTMID$ISTRFCO) .25 > 

A=R+B :A=A+58II35 HC AFEIIFT) SF=1-ABSESGNLPEEKCSSTSIORASF) 5 SRETURN 
DATA24,165.7,53,252,.133,.7, 25.6 a 169,,133,251.133,232,.133.7,202.232,183. 
DATRZ.201,.32,240,.248.232.201. 24a,.240,202 ‚2a. 48.144.227 ,201.5%8.175.,.224 
DATA1S9. ‚2 .,265.233,48, 144.208 .2 GG 1a,176,. 203,72,.165,252, 133,5, 165,251, 10.2 
DATAS,10,38,8,101.251,.133,251.165,8.101.252. 1#3.292.6.251.38, 2S52,.104,.101 
DATA251,133.2531.- 144 ,2,230, 252.,232,263.205,169,.133,211.133,208,.32.207.255 
DATRZa1,32,244. 249.162, 201.13,24Q,13,157,.2,134,7.3 32,207 .255.166,7.222 
DATRA293.233,138.244,221. 169, .157,.2.168,17@, 32.50,207.169.251.133,.253,169 
DATR2S2,133,254.176,201 ,.202,232,189,,2,240,46,201 .32,290,245,201 .689.1r6.4 
DATAZa1.43,176,6,.153,,1,200,.208,232,32,579,207.1765,23,3.169,91,.4a.244,2 
DATA169.93.153,,1.200,199, .2.244,6.153,.1,.232.288, 244, 152,160.2,195,.45,18 
DATA,208,145,45,169,1,.2008.145.45.96 

DATABRK , "ORRLL 43" „ORAL, ARSLE.,FHP.ORASE ‚AS, .ORRI,.RS nd: BPII."ORREL> „'r 
DATA, "ORAL .#" „"ASLE.8",CLC, "ORAI.Y"., ."ORAI, K"U,"'ASLI,.R",„T5SRT."RANDET.%> 
DATA,BITE,ANDE ROLL .PLP,RAND#E,ROL.BITI.ANDI.RCGLI,BMII."ANDELD.Y".-„."ANDE. 
DATA"ROLL,X" „SEC, "ANDI .Y",. . „"RANDI.=" ."ROLI,82" .RTI,"EOR£EL,AD",.. „EORL.LSRI 
DRATAPHA ,EOR#TL ,LSR, IMPJI.EORI,LSRI,.BYCI."EORLCD,V".,„ „"EORL,@","LSRC.®" .CLI 
DATR"EOR],Y",,„"EORI.%" ,"LSRI,.#" .RTS."ADCCEL,#>",, „ADCLE,RÜÖRL,PLR,.ROCHE „ROP 
DATATMPX > ,.RDCI,.RORI.BYSI. "ROCK .Y".. „"ROCL,#" ."RORL.%",SEI."RDCI.YT"., 
DATA"ADCI,#" ,"RORI,8",,"STRCL,MD3" „„‚STYL,STAL.STKL,DEY, „TKA,STYI.STAI.STK] 
DATRBCCI,"STACCD,Y",,"STYL,#" "STALL. #"."STAL.Y".TYA,."STRI,Y".TAS,."STAI.E 
DATA,LOW#L,"LOR<C,SD" „LOX#C,LDY[.LDA[L ,LOs[,TAY,LOR#EC,TRAS,LDYJI.LDARI,LD0%8] 
DATRBCSI,"LORCEI,Y" "LOVE." ."LOAL.=&","LDSC,Y" ,CLY,"LORI,Y",T2S."LDYI,& 
DATA"LDAI,%","LDXJ.Y",CPY#L,"CMPSL.X5", „CPYC,CHPE,DEC[E.INY.CHPAC,DES,CPY) 
DATACHPI,DECI..BNEI,"CMPCCH,Y" ,„„"CMPL.X","DEC[.R2" ,CLO,"CMPJI.Y".-„"CMPI.® 
DATA"DECI.X" CPX#L."SBCEL,X>", ,CPXL,SBCLE, INCL, IN% .SBCHL,HOP.CP=3I,5BCJ. INC 
DATABEQI,"SBC<CI.,.Y",.,„"SBCE.@" ,"INCC.#",SED,."SBC1.Y".,,"SBCJI.#"."INCI.® 


36 


ADC: 
AND: 
ASL: 
BCC: 
BCS: 
BEQ: 
BIT: 
BMI: 
BNE: 
BPL: 
BRK: 
BVC: 
BVS: 
CLC: 
CLD: 
CLI: 
CLV: 
CMP: 
CPX: 
CPY: 
DEC: 
DEX: 
DEY: 
EOR: 
INC: 
INX: 
INY: 
JMP: 
JSR: 
LDA: 
LDX: 
LDY: 
LSR: 
NOP: 
ORA: 
PHA: 
PHP: 
PLA: 
PLP: 
ROL: 
ROR: 
RTI: 
RTS: 
SBC: 
SEC: 
SED: 
SEI: 
STA: 
STX: 
STY: 
TAX: 
TAY: 
TSX: 
TXA: 
TXS: 
TYA: 


BEFEHLSLISTE 


Speicher mit Carry zu Accumulator addieren 
Speicher durch "AND" mit Accumulator verknuepfen 
Speicher/Accumulator um ein Bit linksverschieben 
Verzweigung bei geloeschtem Carry 

Verzweigung bei gesetztem Carry 

Verzweigung bei gesetzter Zero-Flag 

Bit-Test zwischen Speicher und Accumulator 
Verzweigung bei gesetzter Negative-Flag 
Verzweigung bei geloeschter Zero-fFlag 
Verzweigung bei geloeschter Negative-fFlag 
Ausloesung eines Software-Interrupts 

Verzweigung bei geloeschter Overflovw-fFlag 
Verzweigung bei gesetzter Overflow-Flag 

Carry loeschen 

Dezimalmodus ausschalten 

Interrupt freigeben 

Overflow-Flag loeschen 

Speicher mit Accumulator vergleichen 

Speicher mit X-Register vergleichen 

Speicher mit Y-Register vergleichen 

Verminderung des Speicherinhalts um eins 
Verminderung des X-Registers um eins 
Verminderung des Y-Registers um eins 

Speicher durch "EXOR" mit Accumulator verknuepfen 
Erhoehung des Speicherinhalts um eins 

Erhoehung des X-Registers um eins 

Erhoehung des Y-Registers um eins 

Sprung zu Adresse 

Unterprogrammsprung zu Adresse 

Accumulator mit Wert laden 

X-Register mit Wert laden 

Y-Register mit Wert laden 

Speicher/Accumulator um ein Bit rechtsverschieben 
keine Operation 

Speicher durch "OR" mit Accumulator verknuepfen 
Accumulator auf Stack legen 

Prozessorstatus auf Stack legen 

Accumulator vom Stack holen 

Prozessorstatus vom Stack holen 

Linksrotation um ein Bit (Speicher, Accumulator) 
Rechtsrotation um ein Bit (Speicher, Accumulator) 
Ruecksprung aus Interruptsequenz 

Ruecksprung aus Unterprogramm 

Speicher mit Carry von Accumulator subtrahieren 
Carry setzen 

Dezimalmodus einschalten 

Interrupt sperren 

Accumulator in Speicher ablegen 

X-Register in Speicher ablegen 

Y-Register in Speicher ablegen 

Accumulator in X-Register uebertragen 
Accumulator in Y-Register uebertragen 
Stackpointer in X-Register uebertragen 
X-Register in Accumulator uebertragen 

X-Register in Stackpointer uebertragen 
Y-Register in Accumulator uebertragen 


ausgefuehrte Operation, 
symbolische Darstellung 


A+M+C>A,Cc 
AAM-NA 
C=- 76543210 -—0D 
branch on C 
branch 
branch 
AAM, 
branch on N 
branch on Z 
branch on N 
P 
V 
V 


= 
SQ 
nonzuann 


oo» 


PC + 2), 
branch on 
branch on 


ı u 
OÖ 


<< x ZI. < x Zz<x >o0o000 
= 


ey 
1) > PCL 
(PC 2) > PCH 
PC +2), 


an 
in ©) 
ig) 


eration 


A 
X 
Y 
76543210 —C 
p 
MA 


76543210 — C 
76543210 —C 


[ep] 
=. 
{ 
7 
—> 


P>yWı>Px<x< 52 2Z2-,D0N 2» 


a Ze re 


<xxwW>,><<DJ-br-r.F-r->UO DNNINTTIPI D> > I OO > =Z= 2 


(PC + 1) — PCL 
(PC + 2) _. PCH 


38 


BEFEHLSLISTE 


Statusregister 
NVBDIZC 


* * 2 A . * %* 
* 3 oe ®e U} * ®. 
* ®. ® ®. ® * * 
M7M6. U} ® } 
® ® 1 ® 1 ® ®. 
[ _} ®. . . ® 0 
® ® ® 0 U} U} 0} 
} [7 ® 0} 0 oe _} 
} 0 ®. ®. ® ® 3 
* [} ®. U} ® * * 
%* ® ® “. U} * * 
%* y 5 . * %* 
* ®. ®. } * 3} 
* e } . ® * 0} 
* ®. ®. ® * . 
* ®. ® } * 0} 
* ® ®. . * 
* L} . 0} 7 * _} 
* “ ® ® ® * 
* ® EZ “ 2 * U} 
* . “. . * 
* ®. ® } * ® 
0 ® 1 o 0} * * 
* ®. ®. [7 . * ® 
* ®. . ® } * 
vom Stack 
* ® . . . * * 
* ® ® “ ® * * 
vom Stack 
* %* ” Pr * %* 
®. ®. . ®. } l 
“ ®. . 1 . ®. ® 
. ® ®. 1 
* = . * 
* ®. ® ®e * 
* 2 n %+ 
* ® * ®. 
%* A * 


Zeichen- 
erklaerungen 


Accumulator 
X-Register 
Y-Register 
Memory, 
Argument 
P Prozessor- 
status- 
register 
5S Stack- 
pointer 

PC Program- 

counter, 

Programnm- 

zaehler 

PC low 

PC high 

0O Bitwert DO 

l Bitvert 1 

— Transfer 
nach 

= Transfer 
nach 

} Ablegen auf 
Stack 

f Holen vom 

Stack 

Addition 

Subtraktion 

logisches 

UND 

logisches 

ODER 

logisches 

EXKLUSIV- 

ODER, 

Antivalenz 

* beeinflusst 

keine 

Aenderung 

gleich 

Negativflag 

Overflov, 

Vorzeichen- 

ueberlauf 

B Flag fuer 
Software- 
IRQ (BRK) 

D Flag fuer 
Dezimal- 
modus 

I Interrupt- 
disablebit 

Z Zeroflag, 
Nullflag 

C Carry, 
Uebertrag 

B Borrow,_ 

l-c,c€ 


2<x<> 


4 < >ı+ 


<< zZ ı 


acc 
umu 
lat 
or 


10 


74 


106 


imm 
edi 
ate 


105 
4l 


201 
224 
192 


73 


233 


36 


102 


229 


133 
134 
132 


ADRESSIERUNGSARTEN 


zer zer abs abs 
opa opa olu 


ge, 
x 


117 


53 
22 


213 


‚214 


85 
246 


181 


180 
86 


21 


>4 


118 


245 


149 


148 


ge, 
y 


182 


150 


te 


109 
45 
14 


44 


205 
236 
204 
206 


77 
238 


76 
32 
173 
174 
172 
78 


13 


46 


110 


237 


141 
142 
140 


olu 
te, 


221 
222 
93 


254 


189 


188 
94 


29 


62 
126 


253 


157 


39 


abs imp rel 
olu lie ati 


te, 
y 


121 
57 


217 


89 


185 
190 


25 


249 


153 


d 


232 
200 


248 
120 


170 
168 
186 
138 
154 
152 


ve 


144 


176 
240 


48 
208 
16 


80 
112 


(in 
dir 
ect 
„x) 


97 
33 


65 


161 


225 


129 


(in 


(in 


dir dir 
ect ect 


),y 


113 
49 


209 


81 


177 


17 


241 


145 


) 


108 


DER VIDEO INTERFACE CHIP 


Saemtliche Graphikmoeglichkeiten des Commodore 64, sei es 
nun die hochaufloesende Graphik, seien es die Sprites oder 
die "gewoehnliche" Darstellung von 40 Spalten mal 25 Zeilen, 
lassen sich auf den 6567 Video Interface Chip (auch VIC-II- 
Chip genannt) zurueckfuehren. Dieser sehr intelligente Bau- 
stein ermoeglicht, es beim Commodore 64 graphische Effekte 
in Programme einzubauen, die auf anderen Computern eines 
sehr grossen Programmieraufwandes beduerfen oder schlichtweg 
unmoeglich sind. Im folgenden soll nun auf die einzelnen Ei- 
genschaften des VIC-II-Chips eingegangen werden, so dass es 
Ihnen moeglich sein wird, seine Moeglichkeiten vollstaendig 
auszuschoepfen, was jedoch gar nicht so einfach ist. 


Zunaechst einen allgemeinen Hinveis auf die Struktur des 
VIC-II-Chips, die bei saemtlichen Anwendungen beruecksich- 
tigt werden muss. Die 6567 kann, von dem vom Computer adres- 
sierbaren Bereich von 64 KB, jeweils nur 16 KB nutzen. Im 
Normalfall ist dies der Bereich von Adresse O bis 16383, der 
beim Einschalten des Computers als fuer den VIC-II-Chips 
sichtbar deklariert wird. Dieser Bereich von "nur" 16 KB re- 
sultiert aus der Anzahl an Adressleitungen, von denen der 
VIC-II-Chip nur 14 (anstelle der 16 Adressleitungen des Pro- 
zessors) hat. Soll nun ein anderer Bereich spezifiziert ver- 
den (dies kann immer nur in L16-KB-Bloecken geschehen), so 
muss dies in den Bits O und 1 des Ports A (Adresse 56576) 
der NMI-CIA (CIA #2) festgelegt werden. 


Es stehen folgende Moeglichkeiten fuer den Adressbereich des 
VIC-II-Chips zur Verfuegung (das Datenrichtungsregister muss 
natuerlich auf Ausgang geschaltet sein): 


Adressbereich Bitmuster dezimal 
0 - 16383 11 3 Normalvwert 
16384 - 32767 10 2 
32768 - 49151 01 1 
49152 - 65535 00 0 


Um nun auf einen anderen Bereich umzuschalten, muessen Bit 0 
und Bit 1 des Port A auf den unter "dezimal" stehenden Wert 
gesetzt werden. Dies koennte folgendermassen vor sich gehen: 


POKE 56576, PEEK (56576) AND 252 OR dezimal 


Dieses 16-KB-Konzept ist Teil aller Speicherzugriffe des 
VIC-II-Chips und sollte daher unbedingt beachtet werden. Ist 
zum Beispiel der Bereich von 32768 bis 49151 gewaehlt, so 
liegt der Bildschirmspeicher (sofern nicht geaendert) ab der 
Adresse 32768 (Video-Bank-Startadresse) plus 1024 (normale 
Startadresse des Bildschirmspeichers) = 33792. Aber auch die 
Daten der Sprites und der hochaufloesenden Graphik unterlie- 
gen diesem Konzept. 


Ein weiterer Hinweis bezueglich des Video-Chips: Er umfasst 
47 Register, durch die dessen Funktionen gesteuert werden. 
Diese Register liegen im Bereich von 53248 bis 53294 und 
koennen mittels POKE und PEEK bearbeitet werden. Eine Ueber- 
sicht bezueglich des Video-Chips ist dem Anhang zu entneh- 
men. 


Der Bildschirmspeicher 


Der Bereich, in dem die Daten fuer die normale Darstellung 
von 40 mal 25 Zeichen liegen, wird Bildschirmspeicher ge- 


41 


nannt. Dies ist ein Bereich von 10008 Bytes mit einer Breite 
von 8 Bits. Jede Speicherzelle kann daher Werte aus dem Be- 
reich von O bis 255 annehmen. Diese Werte geben im "Standard 
Character Mode" das Zeichen an, das an der entsprechenden 
Stelle des Bildschirms erscheinen soll. In anderen Darstel- 
lungsmodi kann dieser Bereich auch die Farbcodes fuer ein 
Feld von 8 mal 8 Dots enthalten. Darauf wird dann aber ge- 
sondert eingegangen. Der Bildschirmspeicher kann in |]-KB- 
Bloecken verschoben werden. Bei einem fuer den VIC-II-Chip 
adressierbaren Bereich von 16 KB ergeben sich daher 16 Moeg- 
lichkeiten fuer die Lage des Bildschirmspeichers. Bits 4 bis 
7 von Register 24 (Adresse 53272) geben diese- Startadresse 
an. Folgende Tabelle zeigt die moeglichen Bereiche fuer den 
Bildschirmspeicher: 


Adressbereich Bitmuster dezimal 
D - 999 0000 0 
1024 - 2023 0001 l Normalvwert 
2048 - 3047 0010 2 
3072 - 4071 0011 3 
4096 - 5095 0100 4 
5120 - 6119 0101 5 
6144 - 7143 0110 6 
7168 - 8167 OH1 7 
8192 - 9191 1000 B 
9216 - 10215 1001 9 
10240 - 11239 1010 10 
11264 - 12263 1011 11 
12288 - 13287 1100 12 
13312 - 14311 1101 13 
14336 - 15335 1110 14 
15360 - 16359 1111 15 


Auch hier duerfen nur die entsprechenden Bits geaendert ver- 
den, da ein Register oft mehrere Bedeutungen hat. Der Befehl 
zum Aendern des Adressbereichs des Bildschirms lautet ... 


POKE 53272, PEEK (53272) AND 15 OR 16 * dezimal 


Bei der Festlegung der Startadresse fuer die Videomatrix ist 
zu beachten, dass hierzu, vie bei allen Adressfestlegungen 
fuer den VIC-II-Chip, die Startadresse der momentanen Video- 
Bank zu addieren ist, um die wirkliche Startadresse des 
Bildschirmbereichs zu erhalten, ab der dann die Daten abge- 
legt werden koennen. 


Dieser Bereich des Bildschirmspeichers wird nun aber noch 
nicht durch die Zeichenausgaberoutine des Betriebssystems 
unterstuetzt, da das 05 (Operating System) nicht ueber- 
prueft, ob die Startadresse des Bildschirms vom Wert 1024 
abweicht. Hierzu ist es noetig, die Speicherstelle 648 zu 
aendern. Diese gibt die Startpage des Bildschirmspeichers 
an. 


Dazu ein Beispiel: Wurde als Video-Bank der Bereich von 
32768 bis 49151 spezifiziert und soll die Videomatrix ab 
Adresse 35840 liegen (dies entspricht der Adresse 3072 in- 
nerhalb des 16-KB-Bereichs), so muessen folgende Befehle 
eingegeben werden, damit ausserdem die Zeichenausgaberoutine 
des Betriebssystems die Zeichen in diesem Bereich ausgibt: 


POKE 56576, PEEK (56576) AND 252 OR ] 


POKE 53272, PEEK (53272) AND 15 OR 16 * 3 
POKE 648, 35840 / 256 


42 


Hierdurch ist es zum Beispiel auch moeglich, den Bildschirm- 
anfang auf die Adresse 32768 zu legen, da sich auf diese 
Weise das Umschreiben von Programmen fuer die CBMs mit 40 
Zeichen je Zeile wesentlich vereinfacht. Lediglich der Be- 
reich fuer die Farben der einzelnen Zeichen muss hierbei 
noch miteinbezogen werden. 


Da der Bildschirmbereich nur 1000 Bytes umfasst, bleiben am 
Ende noch 24 Bytes des 1-KB-Blocks fuer die Videomatrix ueb- 
rig. Hiervon sind die ersten 16 Bytes unbenutzt, die letzten 
acht Bytes stehen im Zusammenhang mit den Sprites und werden 
bei der Erklaerung der Sprites ausfuehrlich erlaeutert. 


Der Farbspeicher 


Um jedes einzelne Zeichen des Bildschirmspeichers in einer 
der 16 verschiedenen farben darzustellen, wird der Farbspei- 
cher benoetigt. Dieser RAM-Bereich umfasst 1024 Adressen zu 
je 4 Bits (Bit O0 bis Bit 3), wobei jede Zelle einen Wert von 
0 bis 15 enthaelt, der fuer die jeweilige Farbe steht. Der 
Farbspeicher hat jedoch auch noch andere Aufgaben, auf die 
dann aber im entsprechenden Zusammenhang naeher eingegangen 
werden wird. 


Der Farbspeicher kann nicht in einen anderen Bereich verlegt 
verden und liegt daher konstant an den Adressen 55296 bis 
56319, wobei jedoch auch hier, wie bei der Videomatrix, nur 
die ersten 1000 Nybbles (damit ist ein Block von vier Bits 
gemeint) benutzt sind. Die restlichen 24 Nybbles sind unbe- 
nutzt. 


Der Zeichengenerator (Definition eigener Zeichen) 


Im Zeichengenerator sind die Informationen gespeichert, wie 
die Zeichen, die im normalen Darstellungsmodus auf dem Bild- 
schirm erscheinen, aussehen. Da ein Zeichen eine Gebiet von 
8 mal 8 Punkten umfasst, werden zur Definition eines Zei- 
chens 64 Bits (entsprechend 8 Bytes) benoetigt. Bei einem 
Zeichenvorrat von 256 Zeichen ergibt dies 256 * 8 Bytes 
gleich 2 KB, die ein kompletter Zeichensatz einnimmt. 


Die Lage des Zeichensatzes ist in 2-KB-Bloecken frei waehl- 
bar, daraus resultieren 8 Moeglichkeiten fuer den Bereich 
des Zeichengenerators. Die Bits 1] bis 3 des Registers 24 
(Adresse 53272) muessen zur Festsetzung der Startadresse ge- 
aendert werden. Der Zeichengenerator-ROM des Betriebssystems 
liegt in den Adressen von 53248 bis 57343. Es werden 4 KB 
benoetigt, da der Commodore 64 schliesslich zwei vollstaen- 
dige Zeichensaetze vorsieht und bei Umschaltung von einem 
zum anderen Zeichensatz nur die Startadresse geaendert wird. 
Dieser 4-KB-Bereich ist im Normalfall jedoch fuer 1/O und 
das Farb-RAM vorgesehen, und der Benutzer kann nicht direkt 
auf die Daten des Zeichengenerators zugreifen. 


Das Einblenden des Zeichengenerators und das Ausblenden der 
1/0-Bausteine kann durch Loeschen von Bit 2 im Prozessorport 
der CPU 6510 erfolgen. Allerdings muss zuvor der Interrupt 
abgeschaltet werden (Bit 0 des Adresseninhalts von 56334 
loeschen), da das Betriebssystem auf diesen Bereich zugreift 
und, sofern die I/O-Register nicht erreichbar sind, den Conm- 
puter abstuerzen laesst. Nach Zugriff auf den Zeichengenera- 
tor sollte dieser durch Setzen von Bit 2 des Prozessorports 
wieder ausgeblendet werden und das Interrupthandling durch 
Setzen von Bit O des Kontrollregisters A wieder aufgenommen 
werden. Um zum Beispiel den Zeichengenerator aus dem Bereich 
von 53248 bis 55295 in den Bereich von 14336 bis 16383 zu 


43 


uebertragen kann folgendermassen vorgegangen werden: 


POKE 56334, PEEK(56334) AND 254 

POKE 1, PEEK(1) AND 251 

FOR 1=53248 TO 55295 : POKE 1-38912, PEEK(I) : NEXT 
POKE 1, PEEK(1) OR 4 

POKE 56334, PEEK(56334) OR 1 


Da der VIC-II-Chip jedoch immer nur auf einen 16-KB-Bereich 
zugreifen kann, muss das Zeichengenerator-ROM fuer den 
Video-Chip auf eine weitere Weise verfuegbar sein. Schliess- 
lich liegen die Adressen von 53248 bis 57343 nicht im Be- 
reich der Standard Video-Bank von O bis 16383. Daher ist der 
Zeichengenerator zusaetzlich in den Bereichen von 4096 bis 
8191 sowie 36864 bis 40959 sichtbar, dies jedoch nur (!) 
fuer den VIC-II-Chip. RAM, das in diesem Bereich liegt, ist 
daher ohne jegliche Einschraenkungen benutzbar. Auch wenn 
der Zeichengenerator in den vom Prozessor lesbaren Bereich 
eingeblendet wird, so bleiben die obengenannten Bereiche da- 
von unberuehrt. Soll jedoch der VIC-II-Chip auf einen RAM- 
Bereich zugreifen, der auch von Character-ROM "unterlegt" 
ist, so wird dieser sich fuer den RODM-Bereich entscheiden. 
Eigene Zeichensaetze, Bildschirmdaten, HIRES-Graphiken etc. 
sollten daher in anderen Bereichen abgelegt werden. 


Hier eine Uebersicht ueber die moeglichen Bereiche des Zei- 
chengenerators. Zu den Bereichsadressen ist auch hier die 
Bankstartadresse zu addieren: 


Adressbereich Bitmuster dezimal 
0 - 2047 000 0 
2048 - 4095 001 l 

4096 - 6143 010 2 Normalvwert 

6144 - 8191 011 3 
8192 - 10239 100 4 
10240 - 12287 101 5 
12288 - 14335 110 6 
14336 - 16383 ıll 7 


In Video-Bank DO und 2 sind die Bereiche 4096 bis 8191 von 
der Kopie des Zeichengenerators belegt. Zum Aendern der 
Startadresse des Zeichengenerators dient der folgende Be- 
fehl: 


POKE 53272, PEEK (53272) AND 241 OR 2 * dezimal 


Um nun ein eigenes Zeichen zu definieren muss folgenderma- 
ssen vorgegangen werden: Der Bildschirmcode des zu definie- 
renden Zeichens wird mit 8 multipliziert (jedes Zeichen be- 
noetigt zur Darstellung 8 Bytes) und zur Startadresse des 
Zeichengenerators addiert. Diese Adresse gibt nun die Start- 
adresse fuer die Daten dieses speziellen Zeichens an. 


Angenommen, folgendes Summenzeichen solle definiert werden: 


Zeichen Binaer Dezimal 
u oIIIIIlo 126 
“a. ** olloollo 102 

er oolloooo 48 
*%* ooollooo 24 
*%* oolloooo 48 
“ar *%* olloolIo 102 
KraRRH olIIIIIo 126 
00000000 0 


Hierzu gleich ein Hinweis: Es sollten immer mindestens zwei 
gesetzte Punkte nebeneinander liegen, da es ansonsten zu 
farblichen Veraenderungen in der Darstellung kommen kann. 


Ein gesetztes Bit entspricht nun einem Punkt in der Farbe, 
die im zugehoerigen Nybble des Farb-RAMs spezifiziert wurde. 
Geloeschte Bits werden als Dots in der momentanen Hinter- 
grundfarbe dargestellt. 


Um nun dieses Zeichen in den Zeichensatz, den wir zuvor in 
den Bereich von 14336 bis 16383 uebertragen haben, einzubin- 
den, muessen die unter der Spalte 'Dezimal' stehenden Zahlen 
in die Zeichengeneratortabelle uebertragen werden. Vergessen 
Sie nicht, den Bereich ab 14336 vor Zugriff durch BASIC mit- 
tels den Befehlen 


POKE 55, O0 : POKE 56, 56 : CLR 


... zu schuetzen, da sonst der Zeichengenerator ueberschrie- 
ben werden kann (die Befehlsfolge sollte in der ersten Zeile 
des Programms stehen). Soll das Sigma-Zeichen nun dem Bild- 
schirmcode 28 (im Normalfall das Pfund-Zeichen) zugeordnet 
werden, so muessen die Daten fuer das neue Zeichen ab der 
Position 14336 (Startadresse des Zeichengenerators) plus 8 * 
28 (Zeichencode) abgelegt werden. Dies kann zum Beispiel er- 
folgen durch ... 


FOR 1=14560 TO 14567 : READ A : POKE I, A : NEXT 
DATA 126, 102, 48, 24, 48, 102, 126, O 


Auch der Code Null ist in diesem Fall wichtig, da schliess- 
lich alle 8 Zeilen des Zeichens neu belegt werden muessen. 
Nun muss der Zeichensatz mit dem neuen Zeichen noch akti- 
viert werden. Dies erfolgt durch den Befehl zur Festsetzung 
der Startadresse eines Zeichengenerators, in diesem Spezial- 
fall fuer die Startadresse 14336 durch 


POKE 53272, PEEK (53272) AND 241 OR 2 * 7 


Sollten Sie die auf dieser und der vorherigen Seite aufge- 
fuehrten Befehlskombinationen in der korrekten Reihenfolge 
(oberen Bereich vor BASIC schuetzen, Zeichensatz kopieren, 
neues Zeichen in Zeichensatz uebertragen, neuen Zeichengene- 
rator aktivieren) eingegeben haben, so sollte jetzt jedes- 
mal, wenn Sie die Pfund-Taste druecken, das Summenzeichen 
erscheinen. 


Hierzu noch Anmerkungen: Wird nun mittels der Commodore-Ta- 
ste oder ueber CHR$ in einen anderen Zeichensatz umgeschal- 
tet, so wird der Bildschirm keinerlei Zeichen mehr enthalten 
(meist wohl irgendwelche Punkte und Linien), da durch obige 
Befehlsfolgen nur ein Zeichensatz definiert wurde. Es ist 
jedoch moeglich, einen zweiten Zeichensatz zu definieren, 
der dann auch (wie der zweite interne Zeichensatz) direkt 
angesprochen werden kann. Hierbei muessen jedoch beide Zei- 
chensaetze innerhalb eines 4-KB-Blocks liegen. 


Ein weiterer Punkt: Auch wenn nun das Zeichen definiert wur- 
de, so ist das Pfund-Zeichen noch immer als negatives Zei- 
chen vorhanden. Dies ist erkennbar, wenn man zum Beispiel 
den Cursor auf ein Sigma-Zeichen bewegt. Negative Zeichen 
muessen daher, sofern erwuenscht, getrennt definiert werden. 
Soll das bereits als positives Zeichen vorhandene Sigma auch 
als negatives Zeichen mit dem Code 156 (128 plus 28) 
erreichbar sein, so kann die Definition durch 


45 


FOR I = 14336 + 156 * 8 TO 14336 + 156 * 8 + 7 
READ A : POKE I, 255 - A : NEXT 


... erfolgen (vergessen Sie den RESTORE-Befehl nicht, falls 
Sie die gleichen Daten ein weiteres Mal verwenden). Bei ne- 
gativen Zeichen werden gesetzte Bits durch geloeschte Bits 
ersetzt und umgekehrt. 


Durch die Zeichendefinition ist es moeglich, den gesamten 
Zeichensatz umzudefinieren. Allerdings bevirkt ein veraen- 
dertes Aussehen an den Zeichen nichts. Sie haben noch immer 
die gleichen Funktionen, die sie auch vorher hatten, auch 
venn sie in BASIC-Listings vielleicht ein wenig seltsam aus- 
sehen moegen. 


Hier noch einmal kurz die Vorgehensweise, die 8 Bytes an Da- 
ten fuer den Zeichensatz aus einem fertigen 8 mal B Punkte- 
muster zu erzeugen: Jede der acht Zeilen wird getrennt bear- 
beitet und in der Reihenfolge von oben nach unten in der 
DATA-Zeile abgelegt. Die acht Punkte innerhalb einer Zeile 
verden als Binaerzahl aufgefasst. Ein gesetzter Punkt ent- 
spricht daher der Ziffer 1, ein geloeschter Punkt dem Zif- 
fernvert O0. Jede Stelle innerhalb des Bytes (8 Bits) hat nun 
einen bestimmten Wert. Dies sind die Potenzen von 2. Das 
linke Bit hat den Wert 128 (entsprechend 2 hoch 7), das 
rechte Bit den Wert 1 (entsprechend 2 hoch 0). Jeder Wert 
einer Bitposition wird nun mit dem Zifferwert dieses Bits 
multipliziert (das Ergebnis ist also entweder gleich null 
oder gleich dem Bitwert) und alle Ergebnisse addiert. Dies 
ist dann einer der acht Werte. 


Modus fuer erweiterte Hintergrundfarben 


Oft ist es wuenschenswert, mehr als nur eine Hintergrundfar- 
be fuer ein Zeichen zür Verfuegung zu haben. Fuer solche An- 
wendungen ist der Modus fuer erweiterte Hintergrundfarben 
(Extended Background Color Mode) gedacht, der es ermoeg- 
licht, jedem Zeichen eine der vier globalen Hintergrundfar- 
ben zuzuordnen. Ausserdem ist es weiterhin moeglich, eine 
der sechzehn Vordergrundfarben fuer das Zeichen auszuwaeh- 
len. Das Aktivieren dieses Moedus' erfolgt durch Setzen von 
Bit 6 in Register 17 (Adresse 53265) des VIC-II-Chips, wo- 
durch Bit 6 und Bit 7 des in der Videomatrix stehenden Zei- 
chencodes nun als Information ueber die Hintergrundfarbe des 
Zeichens verarbeitet werden. Aus der Kombination von zwei 
Bits ergeben sich nun folgende vier Moeglichkeiten: 


Bit 7 Bit 6 Dezimalbereich Hintergrundfarbregister 
0 0 0 - 63 Background Color #0 (53281) 
0 1 64 - 127 Background Color #1 (53282) 
l 0 128 - 191 Background Color #2 (53283) 
1 l 192 - 255 Background Color #3 (53284) 


Aus der Verwendung der Bits 6 und 7 als Hintergrundfarb- 
pointer (schliesslich geben die beiden Bits nicht die Farbe 
selbst, sondern das Background Color Register, aus dem die 
Farbe stammt, an) resultiert, dass nur noch die Zeichencodes 
von O0 bis 63 verwendet werden koennen. Alle Zeichen mit ei- 
nem Bildschirmcode ab 64 werden wieder in den Bereich von DO 
bis 63 umgewandelt und mit der zugehoerigen Hintergrundfarbe 
dargestellt. 


In BASIC-Programmen lassen sich die Bildschirmcodes recht 


gut erreichen. Die Zeichen von 0 bis 63 (entsprechend den 
CHR$-Codes von 32 bis 95) werden wie gewohnt, dass heisst in 


46 


/ 


der "normalen" Hintergrundfarbe, dargestellt. Die gleichen 
Zeichen mit den Codes von 64 bis 127 (also mit der Hinter- 
grundfarbe #1, die in Adresse 53282 festgelegt wird) koennen 
zum groessten Teil (alle Buchstaben, die restlichen Zeichen 
muessen leider gesucht werden, da nicht bei jeder Taste die 
Kombination mit der Shift-Taste eine Erhoehung des Zeichen- 
codes um 64 bewirkt) durch zusaetzliches Druecken der Shift- 
Taste erreicht werden. Negative Zeichen wiederum werden in 
den Hintergrundfarben #2 und #3 dargestellt. 


Da die Farben selbst nicht dem Zeichencode direkt mitgegeben 
werden (sondern nur die Information, wo die Farbe zu finden 
ist), ist es zum Beispiel moeglich, saemtlichen Zeichen ei- 
ner Hintergrundfarbe gleichzeitig eine neue Hintergrundfarbe 
zuzuordnen, ohne dass etwas am Zeichencode geaendert werden 
muss (es muss einfach nur das Register fuer die entsprechen- 
de Hintergrundfarbe geaendert werden). Die Vordergrundfarbe, 
also die Farbe, in der das Zeichen selbst dargestellt wird, 
kann (vie im normalen Darstellungsmodus auch) ueber die 
Farbtasten geandert werden und wird weiterhin im Color Memo- 
ry (Farb-RAM) im Adressbereich von 55296 bis 56295 abgelegt. 


Mehrfarbige Zeichen (Multicolor Modus) 


Oft ist es erwuenscht, ein Zeichen innerhalb eines B mal B8 
Feldes in mehreren Farben darzustellen. Hierzu eignet sich 
moeglicherweise der 'Modus fuer erweiterte Hintergrundfar- 
ben', der mit dem hier beschriebenen Modus NICHT kombinier- 
bar ist. Eine weitere Moeglichkeit fuer eine groessere fFarb- 
auswahl ist der Multicolor Modus. Dieser wird durch Setzen 
von Bit 4 im Register 22 (Adresse 53270) eingeschaltet. De- 
durch werden die Daten aus dem Zeichengenerator ein wenig 
anders interpretiert, als dies der fall ist, wenn dieses Bit 
geloescht ist. 


Voraussetzung fuer die Darstellung eines Zeichens im Multi- 
color Modus ist, dass Bit 3 im Color-Nybble-RAM gesetzt ist 
(also eine Farbe ueber die Commodore Taste ausgewaehlt wur- 
de). Ist dies nicht der Fall, so wird das Zeichen in der ge- 
wohnten Weise dargestellt (allerdings stehen fuer diese 'ge- 
wohnte Darstellungsveise' - durch die Benutzung von Bit 3 
als Flag - nur noch die ersten acht Farben zur Verfuegung). 
Eine Mischung beider Modi ist daher problemlos moeglich. Bei 
gesetzem Bit 3 im Farb-RAM werden jeweils zwei Bits aus dem 
Zeichengenerator fuer die Auswahl der Farbe verwendet. Da 
aber auch jeweils zwei Punkte angesprochen werden, halbiert 
sich die effektive Aufloesung auf eine Groesse von 4 (hori- 
zontal) mal 8 (vertikal) doppelten Dots. Die Groesse des 
Zeichens bleibt daher bei 8 mal 8 Punkten. Die einzelnen 
Bitpaare koennen folgende Zustaende annehmen und haben daher 
folgende Bedeutungen: 


Bitpaar Farbquelle Funktion 
00 Background #0 (5328]) Hintergrund 
01 Background #1 (53282) Hintergrund 
10 Background #2 (53283) Vordergrund 
11 Color RAM, Bits 0-2 Vordergrund 


Auch fuer die zum Bitpaar '1l]l' gehoerigen Dots stehen nur 
noch die ersten acht Farben zur Verfuegung, da nur noch Bit 
0 bis Bit 2 des Farb-RAM zur Verwendung freistehen. Die 
Spalte 'Funktion' haengt mit der Benutzung von Sprites zu- 
sammen und hat ansonsten keinerlei Bedeutung. 


47 


Hierzu ein Beispiel: 
spiel sind identisch mit denen fuer die Definition des 


ma-Zeichens, 
gesetzt und die DATA-Zeile geaendert werden. 


Es soll folgendes Zeichen (bestehend aus drei 
plus der fuer den Hintergrund zustaendigen Farbe) 


verden: 
Zeichen 


++ * 
++ *%* 
++** 
++** 
*Rrr+ 
u 
v* ++ 


++ 


Die Voraussetzungen 


Farbgruppen 


allerdings muss zusaetzlich das Multicolor 


Binaer 


olIIIIIo 


oloooolo 
ooollooo 
ooollooo 
oolooloo 
oolooloo 
Iooooool 
IoIIlIllolI 


Bei- 
5Sig- 
Bit 


fuer dieses 


Farben (+*#) 
definiert 


Dezimal 


Die Datenzeile muss nun natuerlich lauten 


DATA 126, 66, 24, 24, 36, 36, 129, 190 


Das Einschalten des Multicolor Modus erfolgt durch ... 


POKE 53270, PEEK (53270) OR 16 

Bei vorheriger Auswahl einer Farbe durch die Commodore-Taste 
(!) und Druecken der Pfund-Taste wird nun ein Zeichen ausge- 
geben, das aus zwei Diagonalen und zwei am oberen und unte- 
ren Ende des Zeichens befindlichen Balken (in der spezifi- 
zierten Farbe) besteht. Die Farben der Diagonalen haengen 
von den Registern 53282 und 53283 ab, von denen das erstere 
die Farbe der Diagonalen von links oben nach rechts unten 
angibt und das zweite die der anderen Diagonalen. Aller- 
dings, und das sollte unbedingt erwaehnt werden, ist die 
Farbe nicht unbedingt so sauber, wie dies bei grossen Flae- 
chen (Rahmen oder Hintergrund) der Fall ist. Sie haengt in 
erster Linie vom verwendeten Fernseher beziehungsveise Moni- 


tor ab. Durch POKE-Befehle lassen sich nun die Farben der 
Diagonalen veraendern. Hier stehen jedoch, im Gegensatz zum 
Bitpaar '1l1', alle 16 Farben frei zur Verfuegung. 


Wird das definierte Zeichen allerdings mit einem Cursorfarb- 
code von O bis 7 (oder bei geloeschtem Multicolor Bit) aus- 
gegeben, so wird das Aussehen des Zeichens sich aendern, da 
hier, wie dies auch beim Sigma der Fall war, dann nur noch 
nach gesetzten und geloeschten Bits mit einer Aufloesung von 


8 mal 8 Punkten unterschieden wird. Andererseits ergeben 
sich recht interressante Effekte, wenn bei eingeschaltetem 
Multicolor Modus mit normalen Zeichen gearbeitet wird, die 


im Mehrfarbenmodus dargestellt sind. 


Auch hier ist es, wie dies in aehnlicher Form im Modus fuer 
erweiterte Hintergrundfarben moeglich war, durch Aendern ei- 
nes Registers moeglich, saemtliche zugehoerige Bitpaare (mit 
Ausnahme des Bitpaars 11) auf einmal zu aendern. Diesem 
Prinzip entspricht uebrigens auch die Aenderung der Hinter- 
grundfarbe im normalen Darstellungsmodus. Hier werden saent- 
liche Bits mit dem Wert O (die man als 'nicht sichtbar' be- 
zeichnen wuerde, da sie der Hintergrund des Zeichens sind) 
in einer globalen Farbe dargestellt, im Gegensatz zu den ge- 
setzten Bits, die die zugehoerigen Dots in der im Color 
Nybble RAM spezifizierten Farbe erscheinen lassen. So sind 
im Multicolor Modus drei globale Farben vorhanden. 


48 


Die bis hier beschriebenen Darstellungsmodi, die sich alle 
unter dem Begriff "Zeichendarstellung" zusammenfassen las- 
sen, sind alle Moeglichkeiten der Darstellung bei Zugriff 
auf den Zeichengenerator. 


Die hochaufloesende Graphik (HIRES, High Resolution) 


Zusaetzlich zu den vorher beschriebenen Darstellungsmodi, 
die in irgendeiner form auf einen Zeichengenerator zugrei- 
fen, existiert ein weiterer Darstellungsmodus, in dem jeder 
der 64000 Bildpunkte getrennt angesprochen werden kann. Die- 
ser Modus wird daher 'hochaufloesend' genannt. Er eignet 
sich speziell fuer die Darstellung von mathematischen Funk- 
tionen, die mit grosser Genauigkeit aufgeloest werden koen- 
nen, oder als Hintergrund fuer Spiele, da Sprites auch mit 
HIRES-Graphiken kombinierbar sind. 


Eine Programmierung dieses Bit Map Modus (jedes Bit aus dem 
fuer die hochaufloesende Graphik spezifizierten Bereich ist 
fuer einen Bildschirmpunkt zustaendig) ist sehr aufwendig. 
BASIC ist hierzu speziell aus Geschwindigkeitsgruenden nur 
sehr bedingt geeignet. Man wird bei groesseren Programmen 
auf die Verwendung von Maschinenprogrammen zum Setzen und 
Loeschen von Punkten, Linien und Flaechen wohl nicht ver- 
zichten koennen, falls nicht gar das gesamte Programm in Ma- 
schinensprache geschrieben werden muss. 


Fuer die hochaufloesende Graphik wird ein Bereich von 8000 
Bytes an Speicher benoetigt, der im Normalfall von BASIC- 
Speicher abgezweigt werden muss. Diese B KB werden direkt 
auf dem Bildschirm dargestellt. Es ist daher moeglich, den 
Zustand (genaugenommen die Farbe) eines jeden Punktes direkt 
zu aendern. Wie auch bei der Darstellung von Zeichen aus dem 
Zeichengenerator, so existieren auch im Bit Map Modus unter- 
schiedliche Formen. Dies ist der Standard Bit Map Mode und 
der Multicolor Bit Map Mode. Die horizontale Aufloesung 
wird, wie dies bei mehrfarbigen Zeichen auch der Fall war, 
im Multicolor Bit Map Modus auf die Haelfte (160 doppelte 
Dots) reduziert, da auch hier immer zwei Dots gleichzeitig 
angesprochen werden. In beiden Modi bekommt ausserdem die 
Videomatrix eine neue Bedeutung. Durch sie werden nun zwei 
der moeglichen Farben innerhalb eines Feldes von 8 mal 8 
Dots festgelegt. 


Das Einschalten des Bit Map Modus' erfolgt durch Setzen von 
Bit 5 in Register 17 (Adresse 53265), die Startadresse des 
8-KB-Bereichs (wodurch sich durch die 16-KB-Architektur des 
VIC-II-Chips zwei Moeglichkeiten ergeben) wird durch Bit 3 
in Register 24 (Adresse 53272) festgelegt (natuerlich muss 
auch hier wieder die Startadresse der Video-Bank addiert 
verden): 


Adressbereich Bitwert 
0 - 7999 0 
8192 - 16191 l 


Dieses Bit wird auch zur Festsetzung der Startadresse des 
Zeichengenerators benutzt, der jedoch im HIRES-Modus nicht 
verwendbar ist. Die Startadresse des Zeichengenerators muss 
daher wieder neu gesetzt werden, falls in einen Modus ge- 
schaltet werden soll, der den Zeichengenerator benoetigt. 


Der Bereich von O bis 7999 kann in Video-Bank 0 natuerlich 


nicht benutzt werden, da ansonsten wichtige Systemadressen 
ueberschrieben werden muessten. 


49 


Standard Bit Map Modus 


In diesem Modus bleibt das Color Nybble RAM unbeachtet, nur 
die Videomatrix und der B-KB-Bereich fuer die 64000 Punkte 
werden verwendet. Das erste Byte aus dem 8-KB-Bereich ist 
fuer die ersten acht Punkte zustaendig. Dabei erfolgt die 
Unterteilung innerhalb des Bytes von Bit 7, erster Dot (oben 
links) bis Bit O, achter Dot. Das zweite Byte bestimmt die 
ersten acht Dots innerhalb der zweiten Dotzeile. Dies geht 
so weiter bis zum achten Byte, das die ersten acht Dots der 
achten Dotzeile bestimmt. Ab dem neunten Byte wird nun wie- 
der in die erste Zeile zurueckgegangen. Hier bestimmen die 
Bitzustaende nun das neunte bis sechzehnte Dot von links. 
Auch dieses Prinzip wird (wie man sich bei einer horizonta- 
len Aufloesung von 320 Dots leicht ausrechnen kann) bis zum 
320sten Byte fortgesetzt. Die nun folgenden 320 Bytes be- 
stimmen.die Dotzustaende der Zeilen 9 bis 16. Dieses geht so 
veiter, bis alle der 320 mal 200 Punkte bearbeitet sind. Al- 
lein an dieser zwar sehr logischen aber doch fuer BASIC sehr 
umstaendlich zu handhabenden Aufteilung erkennt man, dass 
wohl viel Zeit allein fuer die Berechnung der Bitposition 
benoetigt wird. Hier eine Darstellung fuer den Aufbau des 
Bildschirms aus den zugehoerigen Bytes: 


Spalte 
0 - 7 8 - 15 ....304 - 311 312 - 319 
Reihe 0: Byte 0, Byte 8, ..., Byte 304, Byte 312 
Reihe l: Byte l, Byte 9, ...,;, Byte 305, Byte 313 


.oeo.o oe. .v.., .ee0 .o...,. ...;,. .oe oe ...,9 .eoo .oeeo 
Reihe 6: Byte 6, Byte 14, ..., Byte 310, Byte 318 
7: Byte 7, Byte 15, ..., Byte 311, Byte 319 


8: Byte 320, Byte 328, ..., Byte 624, Byte 632 

Reihe 9: Byte 321, Byte 329, ..., Byte 625, Byte 633 
‘ “. ve ...y ...,. oe... ..oyg .oeo oe». 

Reihe 14: Byte 326, Byte 334 ..., Byte 630, Byte 638 
Reihe 15: Byte 327, Byte 335, ..., Byte 631, Byte 639 


Reihe 192: Byte 7680, Byte 7688, ..., Byte 7984, Byte 7992 
Reihe 193: Byte 7681, Byte 7689, ..., Byte 7985, Byte 7993 


.... .oeo ua ee ZUR } ...;,- .oeoe 


ie re We RT eg en 
Reihe 198: Byte 7686, Byte 7694, ..., Byte 7990, Byte 7998 
Reihe 199: Byte 7687, Byte 7695, ..., Byte 7991, Byte 7999 
Ist nun ein Bit gesetzt, so wird die Farbe des zugehoerigen 
Punktes vom hoeherwertigen Nybble (MSN, most significant 
nybble) innerhalb der Videomatrix bestimmt, bei geloeschten 


Bits ist dies das niedervwertige Nybble (LSN, least 
significant nybble) der Videomatrix: 


Bitvert Farbe spezifiziert durch 
0 LSN (Bits 0 - 3) des zugehoerigen Videomatrixbytes 
l MSN (Bits 4 - 7) des zugehoerigen Videomatrixbytes 


Es stehen also zwei unterschiedliche Farben, die NICHT aus 
dem Color-Nybble-RAM stammen, innerhalb eines 8 mal B Feldes 
zur Verfuegung. Bei der Darstellung von Funktionen werden 
sich diese beiden Farben wohl ueber den gesamten Bildschirm 
erstrecken, wobei dann eine Farbe als Hintergrundfarbe ver- 
wendet werden wird und eine andere Farbe fuer den Funktions- 


50 


graphen selbst. Bei vier zur Verfuegung stehenden Bits fuer 
jede Farbe koennen daher alle sechzehn Farben verwendet ver- 
den. 


Hier noch eine. Umrechnungmethode in Form eines BASIC-Unter- 
programms, das durch GÜSUB aufgerufen werden kann. Die Va- 
riablen X und Y geben die Koordinate des zu setzenden Punkts 
an: 


B = 8192 + (X AND 504) + 40 * (Y AND 248) + (Y AND 7) 
POKE B, PEEK (B) OR 2 # (7 - (X AND 7)) = RETURN 


Dieses Programm geht von einem Bit Map Bereich von 8192 bis 
16191 aus. Wie erkennbar, ist dieses Programm sehr leicht in 
Maschinensprache zu uebersetzen, da saemtliche Operationen 
direkt durchfuehrbar sind (teilweise jedoch 16 Bit). Die 
Multiplikation mit 40 muss in mehreren Schritten durchge- 
fuehrt werden: Als erstes wird der Operand mit 4 multipli- 
ziert, dann wird der ÜOperand selbst noch einmal addiert 
(dies entspricht einer Multiplikation mit 5). Das Ergebnis 
wird dann noch dreimal linksverschoben. Eine Potenzierung 
zur Basis zwei kann durch Verschiebung eines gesetzten Bits 
innerhalb eines Bytes erfolgen. 


Zum Loeschen eines Punktes muss in der obigen Routine ledig- 
lich der POKE-Befehl etwas geaendert werden: 


POKE B, PEEK (B) AND 255 - 2 (7 - (X AND 7)) 


Um nun zum Beispiel eine Sinuskurve auf den Bildschirm zu 
bringen, kann folgendes Programm verwendet werden: 


POKE 53280, 14 : POKE 55, O : POKE 56, 32 : CLR 

FOR I = 8192 TO 16191 : POKE I, DO : NEXT 

FOR I = 1024 TO 2023 =: POKE I, 1 : NEXT 

POKE 53272, PEEK (53272) OR 8 

POKE 53265, PEEK (53265) OR 32 

FOR X = 0 TO 319 : Y = 100 - 100 * SIN (X * pi / 160) 
GOSUB punktsetzroutine : NEXT 


Dabei ist mit 'pi' natuerlich die Shift-Funktion der Taste 
zwischen 'RESTORE' und '*' gemeint. Als Punktsetzroutine 
kann zum Beispiel die obige verwendet werden. Um die durch 
das Wort 'READY.' erzeugten Farbfelder zu vermeiden, kann 
man am Ende des Programms eine Endlosschleife anfuegen. 


Der Abbruch sollte durch RUNSTOP und RESTORE erfolgen, da 
dann wieder in den Normalmodus zurueckgekehrt wird. Der 
Pointer auf das Ende des Arbeitsspeichers kann dann auch 
wieder rueckgesetzt werden. In diesem speziellen Programm 
waere es nicht einmal noetig gewesen, den Pointer (55/56) zu 
aendern, da keinerlei Strings verwendet werden. Die Ablage 
von Variablen ist jedoch bereits anderweitig erklaert. 


Multicolor Bit Map Modus 


Waehrend im Standard Bit Map Modus nur zwei verschiedene 
Farben für jeden Punkt zur Verfuegung stehen, so sind dies 
im Multicolor Modus vier verschiedene Farben. Mehrere Farben 
koennen benoetigt werden, wenn zum Beispiel zwei verschie- 
denfarbige Linien sich kreuzen oder einfach, um bessere 
Farbgraphiken zu erstellen. Wie dies beim Multicolor Modus 
fuer Zeichen jedoch auch der Fall war, so muss auch hier die 
Haelfte der horizontalen Aufloesung geopfert werden. Es ste- 
hen hier also noch 160 (horizontal) mal 200 (vertikal) dop- 
pelte Dots zur Verfuegung, da auch hier jeweils zwei Bits an 


51 


Daten im Bit Map Speicherbereich fuer zwei Dots Gueltigkeit 
haben. 


Initialisiert wird der Multicolor Bit Map Modus durch Setzen 
des Multicolor Bits (Bit 4) in Register 22 (Adresse 53270) 
sowie natuerlich durch Setzen des Bits fuer den Bit Map Mo- 
dus, Bit 5 in Register 17 (Adresse 53265). 


Die Anordnung der Bytes auf dem Bildschirm bei eingeschalte- 
tem Multicolor Modus ist identisch mit der des Standard Bit 
Map Modus. Lediglich die Bedeutungen der Bits innerhalb ei- 
nes Bytes sind unterschiedlich. Bei zwei Bits an Daten fuer 
jeweils zwei Dots stehen folgende vier Moeglichkeiten zur 
Auswahl: 


Bitpaar Farbquelle Funktion 
00 Background #0 (53281) Hintergrund 
01 MSN (Videomatrix) Hintergrund 
10 LSN (Videomatrix) Vordergrund 
11 Color Nybble RAM Vordergrund 


Die Spalte 'Funktion' steht auch hier im Zusammenhang mit 
den Sprites. 


Wie ersichtlich, existiert eine globale Farbe fuer den ge- 
samten Bildschirm. Ausserdem stehen innerhalb eines jeden B8 
mal 8 Feldes weitere drei Farben zur Verfuegung. Innerhalb 
eines 8 mal 8 Feldes koennen daher maximal vier Farben Ver- 
wendung finden. Waehrend das Farb-RAM im Standard Bit Map 
Mode unbenutzt war, dient es hier als Farbquelle bei der 
Darstellung des Bitpaars '1l1l'. 


Die SPRITES (Movable Object Blocks, MOBs) 


Die Sprites sind, um es einmal ganz bescheiden auszudruek- 
ken, das absolute Nonplusultra des VIC-II-Chips. Durch sie 
ist es zum Beispiel moeglich, Spielprogramme so zu vereinfa- 
chen, dass selbst in BASIC noch schnelle Graphikspiele pro- 
blemlos auch fuer den Einsteiger zu programmieren sind. In 
Maschinensprache ergibt sich dann sogar die Steigerung die- 
ses Superlativ, da man viele Moeglichkeiten (gerade im Zu- 
sammenhang mit der hochaufloesenden Graphik) von- BASIC aus 
gar nicht voll ausnutzen kann. 


Bei den Sprites handelt es sich um eine Art uweberdimensio- 
niertes Zeichen in einer Groesse von 24 (horizontal) mal 2] 
(vertikal) Bildschirmpunkten. Diese 504 Punkte eines Sprites 
koennen beliebig gesetzt und geloescht werden, so wie das 
bei der hochaufloesenden Graphik auch der Fall war. Sprites 
koennen ausserdem mit jedem Bildschirmmodus uneingeschraenkt 
kombiniert werden, ganz gleich, ob es sich dabei um die 
hochaufloesende Graphik, einen Multicolor Modus oder die 
Darstellung von einzelnen (durch den Zeichengenerator defi- 
nierten) Zeichen handelt. 


Die Programmierung der Sprites erfolgt unabhaengig von der 
des restlichen Bildschirms. So muss bei der Erstellung fuer 
die Graphik eines Spiels in keinster Weise auf die Bewegun- 
gen der MOBs Ruecksicht genommen werden. Allerdings ist es 
moeglich, Kollisionen eines Sprites mit dem webrigen Bild- 
schirm oder mit anderen der wingesamt acht verchiedenen 
Sprites zu erkennen. Es muessen daher noch nicht einmal Ab- 
fragen auf die Positionen der Sprites in ein Programm einge- 
baut werden, da diese Ueberpruefungen bereits durch den MOS 
6567 durchgefuehrt werden. 


52 


Jedes Sprite laesst sich in X- und Y-Richtung bewegen. Man 
gibt dem VIC-II-Chip dazu nur die gewuenschte Position an, 
worauf das Sprite an diese Position gesetzt wird. Auch sind 
Ueberlagerungen von Sprites, Bildschirmvorder- und Hinter- 
grund moeglich, so dass der Eindruck einer dreidimensionalen 
Darstellung erreicht werden kann. 


Der Aufbau der Sprites 


Jedes Sprite besteht aus 504 Punkten, die einzeln beein- 
flusst werden koennen. Ein Sprite stellt also ein kleines 
Gebiet hochaufloesender Graphik dar. Um diese 504 Punkte zu 
definieren, benoetigt man 63 Bytes, da jedes Byte aus 8 Bit 
(und jedes Bit ist fuer einen Dot zustaendig) besteht. Diese 
63 Bytes werden in einem Block im Arbeitsspeicher abgelegt. 
Die Zuordnung der Bytes innerhalb des Gebiets von 24 mal 21 
Punkten ist folgendermassen: Das erste Byte bestimmt die er- 
sten acht Punkte der ersten Zeile, das zweite Byte die Punk- 
te 9 bis 16, das dritte die Punkte 17 bis 24 der ersten Zei- 
le. Die naechsten drei Bytes sind fuer die zweite Zeile zu- 
staendig. Dies geht so bis zum 21. Block von drei Bytes wvei- 
ter. Innerhalb eines Bytes ist (wie dies auch bei der Defi- 
nition von eigenen Zeichen oder bei der hochaufloesenden 
Graphik der Fall war) Bit 7 dem ersten Bildschirmpunkt in- 
nerhalb der Reihe von acht Punkten zugeordnet, Bit 0 ent- 
sprechend dem letzen Dot. Zum Aufbau hier noch eine anschau- 
liche Darstellung: 


Spalte 


0- 7 8 - 15 16 - 23 


Zeile 0: Byte 0, Byte 1], Byte 2 
Zeile 1: Byte 3, Byte 4, Byte 5 
Zeile 2: Byte 6, Byte 7, Byte 8 
Zeile, 3: Byte 9, Byte 10, Byte 11 


Zeile 17: Byte 51, Byte 52, Byte 53 
Zeile 18: Byte 54, Byte 55, Byte 56 
Zeile 19: Byte 57, Byte 58, Byte 59 
Zeile 20: Byte 60, Byte 61, Byte 62 


Da jedes Bit. eines Bytes der Sprite-Daten einem Dot des 
Sprites zugeordnet ist, ergeben sich fuer die Bedeutung der 
Bits folgende Moeglichkeiten: 


Bitvert Bedeutung 


0 transparent, keine Aenderung des Bildschirmbildes 
1 Darstellung des Punktes in der Farbe des MOBs 


Im Gegensatz zu den Bedeutungen der Bits bei den anderen 
Bildschirmmodi ergibt sich aus dem Bitwert OD hier keine Dar- 
stellung des Punktes in der Hintergrundfarbe. Vielmehr wird 
dieser Spritepunkt ueberhaupt nicht beachtet, so dass die 
Daten, die normalerweise an dieser Stelle auf dem Bildschirm 
stehen, weiterhin sichtbar bleiben. 


Die Farbe des MOBs, also die Farbe der Punkte, deren Daten- 
bits gesetzt sind, wird in den Registern 39 bis 46 des VIC- 
II-Chips festgelegt. Diese Register liegen an den Adressen 
53287 bis 53294, deren untere vier Bits (LSN) den Farbcode 
enthalten. In diesen Registern koennen die oberen 4 Bits un- 
beachtet bleiben (es muss also der fFarbwert nicht mittels 
'AND' und 'OR' festgesetzt werden), da diese keinerlei Funk- 


53 


tion haben. Somit kann ein Sprite in jeder der sechzehn Far- 
ben dargestellt werden. 


Sprites belegen einen "geraden" Block von 64 Bytes, wovon 
nur die ersten 63 Bytes benutzt sind. Es stehen also winner- 
halb eines 16-KB-Bereichs insgesamt 256 Moeglichkeiten der 
Ablage von Sprite-Daten zur Verfuegung. Soll zum Beispiel 
ein Sprite ab der Adresse 832 abgelegt werden, so ist dies 
der 64-Byte-Block mit der Nummer 13 (von Nummer 0 ausge- 
hend). Die Ablage dieser Nummern fuer die acht MOBs erfolgt, 
wie schon bei der Erklaerung der Videomatrix angedeutet, am 
Ende der 24 restlichen Bytes des 1024-Byte-Bereichs des 
Bildschirmspeichers. Dies ist im Normalfall der Bereich von 
2040 bis 2047, wobei 2040 die Startadresse von Sprite Nummer 
0 angibt. Sollten also die Daten fuer Sprite Nummer 5 ab der 
Adresse 832 abgelegt werden, so muesste dies dem VIC-II-Chip 
durch ... 


POKE 2045, 13 


... mitgeteilt werden. Die Angabe der Position der Sprite- 
Daten ist allerdings nicht genug. ‚Jedes Sprite verfuegt au- 
sserdem noch ueber einen Schalter, der angibt, ob: dieses 
Sprite momentan auch auf dem Bildschirm dargestellt werden 
soll. Diese acht Schalter befinden sich im Register 2]1 
(Adresse 53269) des Video-Chips. Jedes Bit (von Bit 0 bis 
Bit 7) ist dem entsprechenden Sprite (Spritenummer identisch 
mit Bitnummer) zugeordnet. Ist ein solches Bit gesetzt, so 
wird das Sprite entsprechend den Daten dargestellt. Ist es 
geloescht, so existiert dieses Sprite nicht. Es wird in kei- 
ner Form auf die Daten zugegriffen oder aehnliches. 


Ausserdem laesst sich jedes Sprite sowohl in X-Richtung als 
auch in Y-Richtung in seiner Ausdehnung verdoppeln. Somit 
kann ein MOB maximal eine Ausdehnung von 48 mal 42 Punkten 
haben. Eine Verbesserung der Aufloesung wird damit aber 
nicht erreicht. Jeder Bildschirmpunkt wird lediglich in zwei 
Zeilen und/oder Spalten dargestellt, so dass der MOB in dop- 
pelter/vierfacher Groesse erscheint. 


Diese Erweiterung in X- oder Y-Richtung wird durch die Regi- 
ster 29 (Adresse 53277, X-Erweiterung) und Register 23 
(Adresse 53271, Y-Erweiterung) festgelegt. Auch hier sind 
die Bits von Bit O bis Bit 7 den Sprites von O bis 7 zuge- 
ordnet. Ist ein Bit in einem dieser Register gesetzt, so 
wird das entsprechende Sprite in die ausgewaehlte Richtung 
verbreitert. 


Zusaetzlich existiert noch das Prioritaetsregister, auf das 
aber erst spaeter im Zusammenhang mit Kollisionen eingangen 
werden soll. Es befindet sich an der Adresse 53275 und wird 
im folgenden erst einmal unbeachtet belassen. 


Nun zur Festlegung der Position des Sprites auf dem Bild- 
schirm: Jedes Sprite kann an jeder Stelle des Bildschirms 
stehen. In horizontaler Richtung ergeben sich, resultierend 
aus der Bildschirmbreite von 320 Punkten und der Sprite- 
breite von 24 Punkten, insgesamt 297 verschiedene Positio- 
nen, in denen das Sprite vollstaendig dargestellt ist. Dies 
sind die X-Werte im Bereich von 24 bis 320. Dabei beziehen 
sich diese Werte auf die linke obere (eventuell, je nach 
Sprite-Daten, auch nicht vorhandene) Ecke des Spriteblocks. 
Ist ein X-Wert von 24 gewaehlt, so befindet sich die linke 
Kante des Spriteblocks am Rand des linken Bildschirmrahmens. 
Die 180 vollstaendig sichtbaren Y-Werte liegen von 50 bis 
229. Werden Werte ausserhalb dieses Bereiches gewaehlt, so 


54 


ist das Sprite nur teilweise sichtbar. So ist es zum Bei- 
spiel moeglich, ein Sprite langsam auf dem Bildschirm er- 
scheinen zu lassen. 


Die Festlegung der Sprite-Koordinaten geht folgendermassen 
vor sich:. 


Register 1 (Adresse 53249) enthaelt die Y-Koordinate des er- 
sten Sprites (Nummer O0). Wie bereits erwaehnt, bevirken man- 
che Werte nur eine teilweise (oder gar keine) Darstellung 
des Sprites au dem Bildschirm. 


Register O0 (Adresse 53248) sowie Bit 0 von Register 16 
(Adresse 53264) bilden zusammen das Register fuer die X-Ko- 
ordinate des Sprites Nummer O mit einer Breite von 9 Bits. 
Dies ist notwendig, da der Bildschirm eine Breite von mehr 
als 256 Dots hat. Bei X-Werten im Bereich von OD bis 255 ist 
demnach Bit O0 von Register 16 geloescht. Ist es gesetzt, 
liegt der X-Wert im Bereich von 256 bis 511. Auch hier fueh- 
ren manche Werte wieder zu einer unvollstaendigen Darstel- 
lung des MOBs. 


Zum langsamen Erscheinen von Sprites: Hat ein Sprite die 
normale Groesse von 24 mal 21 Punkten, so ist es moeglich, 
diesen Sprite von jeder Seite aus in einzelnen Rasterzeilen 
auf den Bildschirm zu bevegen. Ist der Sprite jedoch in 
X-Richtung verdoppelt worden, so ist er zu breit, um "unter" 
dem linken Rand versteckt zu werden. In X-Richtung erveiter- 
te Sprites sollten daher nicht am linken Rand in Erscheinung 
gebracht werden, falls auf ein stueckweises Erscheinen Wert 
gelegt wird. Bei der Verbreiterung in Y-Richtung entstehen 
keinerlei Probleme. Auch bei verbreiterten MOBs geben die 
Koordinatenregister die Position der linken oberen Ecke an 
(eine Verbreiterung erfolgt nach rechts oder unten, nicht um 
den urspruenglichen Sprite herum), die linke obere Ecke ver- 
aendert ihre Position nicht. 


Die Koordinaten des Sprites Nummer ]l werden in den Registern 
2 (Y-Koordinate) sowie Register 3, das zusammen mit Bit ]1 
von Register 16 wieder den 9-Bit-breiten Wert fuer die X-Ko- 
ordinate ergibt, festgelegt. Die Koordinatenregister der 
veiteren Sprites liegen (auch jeweils paarweise plus einem 
zusaetzlichen Bit aus Register 16) in den Registern 4 bis 15 
(jeweils die acht niedervwertigen Bits fuer die X-Koordinate 
im ersten Register, dann die Y-Koordinate). 


Hierzu jetzt endlich ein Beispiel: Folgender Pac-Man ("Pac- 
Man" ist ein Warenzeichen der Firma ATARI) soll als ein 
Sprite definiert werden: 


DI ATINLBIEDDOAITNIN LINIEN 


Te retten febjab jerb ja jan jan fan jmuh 


55 


Um aus diesem Muster nun ein Programm zu machen, das diese 
Figur auf den Bildschirm bringt, muessen zuerst saemtliche 
63 Bloecke zu je acht Punkten in Dezimalwerte umgewandelt 
verden. Dazu muss in der gleichen Weise vorgegangen werden, 
vie bei der Definition eigener Zeichen auch. Die daraus er- 
haltenen 63 Zahlen muessen dann in DATA-Zeilen eingebaut 
werden. Die Anordnung erfolgt wie zuvor angegeben: von Zeile 
0 bis Zeile 20 und innerhalb der Zeilen die Bytes von links 
nach rechts. Man erhaelt fuer den "Pac-Man" folgende Werte 
fuer die DATAs: 


100 DATA 0, 127, 0 210 DATA 255, 254, 0 
110 DATA 3, 255, 192 220 DATA 255, 254, 0 
120 DATA 15, 255, 240 230 DATA 255, 255, 0 
130 DATA 31, 255, 248 240 DATA 127, 255, 128 
140 DATA 63, 243, 252 250 DATA 127, 255, 192 
150 DATA 127, 243, 254 260 DATA 63, 255, 224 
160 DATA 127, 255, 254 270 DATA 31, 255, 240 
170 DATA 255, 255, 252 280 DATA 15, 255, 224 
180 DATA 255, 255, 240 290 DATA 3, 255, 192 
190 DATA 255, 255, 192 300 DATA 0, 127, 0 


Die folgende Zeile dient dazu, diese Werte im Bereich von 
832 bis 894 abzulegen ... 


310 FOR I = 832 TO 894 : READ A : POKE I, A : NEXT 


Sollen nun Sprite Nummer DO diese Daten (im Speicherblock 13) 
zugeordnet werden, so erreicht man dies durch 


320 POKE 2040, 13 


Ausserdem muss dieser Sprite nun noch eine Farbe (gelb) be- 
kommen und die Freigabe fuer die Ausgabe auf dem Bildschirm 
muss erfolgen: 


330 POKE 53287, 7 : POKE 53269, 1 


Durch diese Zeile wird nun noch die Figur ueber den Bild- 
schirm bevegt: 


340 FOR I = 0 TO 255 : POKE 53248, I : POKE 53249, I : NEXT 


Bevor Sie das Programm durch 'RUN' starten, sollten Sie noch 
einmal "RUNSTOP" und "RESTORE" druecken, damit eventuell 
noch vorhandene Restparameter aus anderen Programmen aus dem 
Video-Chip entfernt werden (Initialisierung des VIC-II- 
Chips). Die Figur wird nun diagonal ueber den Bildschirm be- 
vegt. 


Diese Figur kann nun natuerlich auch noch in X-Richtung und 
Y-Richtung vergroessert werden. Bauen Sie doch noch einmal 
zusaetzlich eine der folgenden Zeilen ein: 


335 POKE 53271, 1 : POKE 53277, 0 
335 POKE 53271, O0 : POKE 53277, 1 
335 POKE 53271, 1 : POKE 53277, 1 


Soll Ihr "Pac-Man" nun auch noch Fressbewegungen machen, so 
muessen Sie saemtliche verschiedenen Figuren erst einmal in 
verschiedenen 64-Byte-Bloecken ablegen. Um nun die verschie- 
denen Figuren auch erscheinen zu lassen, wird einfach der 
Zeiger auf den Datenblock (bei diesem Beispiel in Adresse 
2040) der naechsten Figur gesetzt. So wird eine bewegte 
Spielfigur gezeigt, ohne dass die Daten ausgetauscht werden 


56 


muessen. Ein Datenblock kann jederzeit verschiedenen Sprites 
gleichzeitig zugeordnet sein. Besteht ein Spiel also aus 
mehreren gleichen Figuren, so muessen die Daten dazu nur 
einmal vorhanden sein. 


Multicolor Sprites 


Auch Sprites lassen sich im Multicolor Modus darstellen. 
Dies ermoeglicht es dem Programmierer, einem Sprite drei 
Farben (plus transparent) zuzuordnen. Jedoch werden auch 
hier jeweils zwei Bits der Daten verwendet, um die Farbe zu 
spezifizieren, so dass sich die horizontale Aufloesung auf 
12 doppelte Punkte halbiert. Da aber (wie in allen Multico- 
lor Modi) immer zwei Punkte auf einmal angesprochen werden, 
veraendert sich die Spritegroesse nicht. Sprites lassen sich 
unabhaengig voneinander in den Multicolor Modus schalten. 
Die geschieht durch das Setzen des entsprechenden Bits in 
Register 28 (Adresse 53276). Bit O ist hier Sprite Nummer O0 
zugeordnet, Bit 7 ist fuer Sprite Nummer 7 zustaendig. Auch 
Multicolor Sprites lassen sich vergroessern; dies erfolgt in 
gleicher Weise, wie bei normalen Sprites auch. 


Hier die Bedeutungen der Bitpaare: 


Bitpaar Farbquelle 


00 transparent 

01 MOB Multicolor #0 (Register 37) 
10 MOB Farbe (Register 39 bis 46) 

11 MOB Multicolor #1 (Register 38) 


Wie erkennbar, existiert fuer Multicolor MOBs also eine ei- 
gene Farbe fuer jeden MOB sowie zwei globale Farben, die 
fuer alle MOBs verwendet werden. Diese beiden globalen Far- 
ben befinden sich in den Adressen 53285 und 53286. Auch hier 
koennen die Farbwerte (von O bis 15 fuer alle sechzehn Far- 
ben) ohne Beruecksichtigung der hoeherwertigen Bits (wie das 
bei allen Farbregistern der Fall ist) direkt in das Register 
eingeschrieben werden, da die hoeherwertigen Bits keinerlei 
Bedeutung haben. 


Prioritaeten 


Sprites haben untereinander und zu dem uebrigen Bildschirm 
bestimmte Prioritaeten. Ueberlappen sich zum Beispiel nicht- 
transparente Daten zweier Sprites, so werden die Daten des 
Sprites mit der niedrigeren Nummer dargestellt. So verdeckt 
bespielsweise Sprite Nummer O immer die Dots der wuebrigen 
Sprites. 


Anders ist dies im Zusammenhang mit dem uebrigen Bildschirm. 
Hier ist es fuer den Benutzer frei waehlbar, ob die Sprites 
vor oder hinter den Vordergrunddaten dargestellt werden 
(Hintergrunddaten rangieren immer an unterster Stelle der 
Prioritaet und werden daher immer von nichttransparenten Da- 
ten verdeckt). Register 27 (Adresse 53275) enthaelt nun fuer 
jeden MOB ein Prioritaetsbit. Ist dieses Bit gesetzt, so 
werden MOB-Daten durch Vordergrunddaten verdeckt. Bei ge- 
loeschtem Bit haben die MOB-Daten eine hoehere Prioritaet 
und werden daher "ueber" den Vordergrunddaten dargestellt. 


Im Zusammenhang mit den Prioritaeten erklaert sich nun auch 
die Spalte 'Funktion' bei den Uebersichten ueber die Bedeu- 
tungen der Bitpaare in den Multicolor Modi. Waehrend bei den 
Standard Modi geloeschte Datenbits Hintergrund und gesetzte 
Datenbits Vordergrund repraesentieren, so kann in den Multi- 


57 


color Modi mit zwei Hintergrundfarben gearbeitet werden, von 
denen dann auch keine (weder '00', noch '01') andere Daten 
verdeckt. 


Dieses System hat allerdings einen kleinen Nachteil: Da bei 
Ueberlagerung zweier MOBs zuerst die Prioritaet der MOBs un- 
tereinander ausgevertet wird und dann erst die Prioritaet 
zum Bildschirm, mag es in einigen Faellen zu einer "fal- 
schen" Darstellung auf dem Bildschirm kommen, indem durch 
ein MOB verdeckte Vordergrunddaten durch ein zweites Sprite 
(mit niederer Nummer und daher hoeherer Prioritaet zum ande- 
ren Sprite, aber niederer Prioritaet zum Bildschirmvorder- 
grund) wieder "sichtbar" gemacht werden. Dies duerfte aber 
in den meisten Faellen vernachlaessigt werden. 


Kollisionen 


In Spielen ist es wichtig festzustellen, ob sich Sprites be- 
ruehren oder ob ein Sprite soeben Vordergrunddaten ueber- 
lappt. Alle diese Faelle werden naemlich durch den VIC-II- 
Chip bereits geprueft. Es muessen die fertigen Daten nur 
noch ausgevertet werden. 


Kollisionen zwischen Sprites 


Treffen nichttransparente Daten zweier (oder mehr) Sprites 
zusammen, so wird in Register 30 (Adresse 53278) das ent- 
sprechende Bit eines jeden Sprites gesetzt, das in dieses 
Zusammentreffen verwickelt ist. Gleichzeitig wird Bit 2 des 
Interrupt Latch Registers gesetzt, so dass (falls der Inter- 
rupt freigegeben ist) der Prozessor in die Interruptroutine 
verzweigen kann, wo dann die Kollision behandelt werden 
kann. 


Kollision zwischen Vordergrunddaten und Sprites 


Auch hier wird beim Zusammentreffen eines Sprites mit Vor- 
dergrunddaten (im Multicolor Modus gilt das Bitpaar '01', 
wie im Zusammenhang mit den Prioritaeten, als Hintergrund) 
fuer dieses Sprite in Register 31 (Adresse 53279) das zum 
Sprite gehoerige Bit gesetzt. Hierbei wird dann Bit |] des 
Interrupt Latch Registers gesetzt. Eine Behandlung von Kol- 
lisionen zwischen Sprites und Vordergrunddaten kann daher 
auch hier durch eine Interruptroutine erfolgen. 


Kollisionen (allgemein) 


Ein Bit in einem der Kollisionsregister bleibt solange ge- 
setzt, bis das Register ausgelesen wird. Das zugehoerige Bit 
im Interrupt Latch wird dann gesetzt, wenn mindestens ein 
Bit in .einem der Kollisionsregister gesetzt wird. Bei fol- 
genden Kollisionen wird dieses Latchbit NICHT gesetzt, falls 
nicht vorher das Kollisionsregister gelesen wurde, auch wenn 
das Latchbit mittlerweile geloescht wurde. 


Die Interrupt-Register 


Die Interrupt-Register ermoeglichen ausser der Erkennung von 
Kollisionen noch die Abfrage des Lightpen-Eingangs und des 
Rasteregisters (siehe jeweils dort). 


Die Steuerung der Interrupts wird durch zwei Register des 
VIC-II-Chips vorgenommen: Das erste ist das Interrupt Enable 
Register (Register 26, Adresse 53274). In ihm wird festge- 
legt, ob durch einen der vier faelle, die einen Interrupt 
ausloesen koennen, auch die Interrupt-Leitung des Prozessors 


58 


auf Low gezogen werden soll. Die in diesem Register vervwen- 
deten unteren vier Bits stehen fuer die vier Interruptquel- 
len. Jede Interruptquelle kann also unabhaengig von anderen 
Interrupts als Ausloeser eines IRQs freigegeben werden, um 
so dem Prozessor mitzuteilen, dass ein zu behandelndes ETr- 
eignis aufgetreten ist. 


Freigegeben wird ein Interrupt, indem das zugehoerige Bit 
des Interrupt Enable Registers auf den Wert 1 gesetzt wird. 
Das Sperren einer Interruptquelle erreicht man entsprechend 
durch das Loeschen des zugehoerigen Bits. Beim Auslesen wird 
der entsprechende Wert zurueckgegeben (die unbenutzten Bits 
4 bis 7 haben den Bitvert |) 


Hier die Zuordnungen der Bits sowohl des Interrupt Latch Re- 
gisters als auch des Interrupt Enable Registers: 


Bitposition Zustaendig fuer Interruptquelle ... 


Rasterregister 

Kollision zwischen Sprite und Vordergrunddaten 
Kollision zwischen Sprites 

Negative Flanke auf Lightpen-Input 


VUND-t+O 


Unabhaengig davon, ob eine Interruptquelle als Ausloeser 
freigegeben ist, wird im Interrupt Latch Register (Register 
25, Adresse 53273) das zur Quelle gehoerige Bit gesetzt, 
wenn ein entsprechendes Ereignis auftritt (Kollision etc.). 
Ist ausserdem dieser Interrupt auch durch ein gesetztes Bit 
im Interrupt Enable Register freigegeben, so wird zusaetz- 
lich Bit 7 im Interrupt Latch Register gesetzt (ansonsten 
ist Bit 7 geloescht). Dies signalisiert dem Programm, dass 
die Interruptleitung zum Prozessor auf Low-Pegel gelegt wur- 
de. 


Dieses Bit 7 von Register 25 laesst sich verwenden, um in- 
nerhalb der Interruptroutine zu erkennen, ob der VIC-II-Chip 
Ausloeser fuer den Interrupt war, da schliesslich auch die 
IRQ-CIA einen IRQ ausloesen kann. So kann gleich zu Beginn 
der Routine festgestellt werden, ob eine Verzweigung in eine 
Behandlungsroutine fuer den VIC-II-Chip erfolgen muss. 


Ein gesetztes Latchbit im Interrupt Latch Register kann 
durch Schreiben einer Eins in die gleiche Bitposition wieder 
geloescht werden. 


Das Raster Register 


Dieses Register (Register 18, Adresse 53266 sowie Bit 7 von 
Register 17, Adresse 53265) gibt die Zeile des momentan auf 
den Bildschirm gebrachten Bildschirminhalts an. Dies kann 
dazu verwendet werden, um bei Aenderungen des Bildschirm- 
inhalts ein Flackern zu vermeiden. Man darf in diesem Fall 
dann nur solche RAM-Bereiche aendern, die waehrend des Aen- 
derungsvorganges nicht durch den VIC-II-Chip ausgelesen ver- 
den. 


Wird in dieses Register 18 (inklusive Bit 7 von Register 17) 
schreibend zugegriffen, so wird dieser Wert in ein internes 
Latch uebertragen. Erreicht das Raster Register diesen zwvi- 
schengespeicherten Wert, so wird Bit O des Interrupt Latch 
Registers gesetzt. Ist Bit O0 des Interrupt Enable Registers 
gesetzt, so wird ausserdem ein IRQ ausgeloest. Das Raster 
Register wird beim Commodore 64 dazu benutzt, um die Fern- 
sehnorm/Taktfrequenz des Geraetes festzustellen. 


59 


Der Lightpen-Input 


Bei Auftreten einer negativen Flanke auf dem Lightpen-Input 
wird die momentane Bildschirmposition in ein Latch uebertra- 
gen. Das Register 19 (Adresse 53267) enthaelt dann die acht 
hoechstwertigen der neun fuer die X-Position zustaendigen 
Bits. Daher betraegt die horizontale Aufloesung nur zwei 
Dots. Die Y-Position zum Zeitpunkt der negativen Flanke wird 
in Register 20 (Adresse 53268) wuebertragen (innerhalb des 
sichtbaren Bereichs des Bildschirms reichen fuer die verti- 
kale Aufloesung jedoch acht Bits aus). Je Einzelbild kann 
aber nur einmal eine Uebertragung der Position in das Light- 
pen Latch erfolgen. 


Bei einer negativen Flanke am Lightpen-Input wird ausserdem 
Bit 3 im Interrupt Flag Register gesetzt, so dass bei ge-. 
setztem Bit 3 im Interrupt Enable Register ein IRQ ausge- 
loest wird. Allerdings sollte in Programmen beachtet werden, 
dass - durch Verwendung der Ports der IRQ-CIA sowohl fuer 
die Tastatur als auch fuer die Kontrollports - auch durch 
die Tastatur eine negative Flanke auf den Lightpen-Input ge- 
geben werden kann. 


SCREEN BLANKING 


Wird Bit 4 in Register 17 (Adresse 53265) geloescht, so wird 
der gesamte Bildschirm mit der Rahmenfarbe (Exterior Color, 
Register 32) gefuellt. Der Prozessor greift nur noch waeh- 
rend Phase 1 auf den Systembus zu, der Prozessor wird nicht 
mehr angehalten, ihm steht also der gesamte Bus zur Verfue- 


gung. 


Allerdings wird bei aktiven Sprites trotzdem auf deren Daten 
zugegriffen, falls Register 21 (MOB Enable) nicht auf den 
Wert null gesetzt wurde. 


Da waehrend der Recorderoperationen die CPU keinesfalls an- 
gehalten werden darf (es handelt sich um sehr zeitabhaengige 
Routinen), wird beim Commodore 64 waehrenddessen der Bild- 
schirm auf die genannte Weise "abgeschaltet", um ein ein- 
wandfreies Arbeiten des Computers zu gewaehrleisten. Sollten 
waehrend dieses Zeitraums jedoch MOBs aktiviert sein, so 
duerfte es vermutlich zu Lesefehlern kommen (falls ueber- 
haupt Daten erkannt wurden). 


Scrolling in einzelnen Punktzeilen 


Unter "Scrolling" versteht man das Verschieben des Bild- 
schirminhalts in eine bestimmte Richtung. Waehrend der Conm- 
modore 64 den Bildschirminhalt im Normalfall nur nach oben 
verschieben kann (wenn der Cursor ueber den unteren Bild- 
schirmrand hinaus bewegt wird oder ueber den unteren Bild- 
schirmrand hinaus gedruckt wird), so kann auch die Notven- 
digkeit bestehen, den Bildschirminhalt in die anderen Rich- 
tungen zu verschieben. Diese Eigenschaft hat zum Beispiel 
ein sogenannter "SCROLLER", der zum Beispiel in EXBASIC 
LEVEL II fuer den Commodore 64 enthalten ist. Beim Progranm- 
mieren von BASIC ermoeglicht er es, BASIC-Programme ueber 
den Bildschirm zu rollen, als waeren sie in einem Band vor- 
handen. Das englische Wort "scroll" heisst schliesslich auch 
"Schriftrolle". Wird mit dem Cursor ueber den Bildschirmrand 
hinausgefahren, so wird die naechste oder vorherige (je 
nachdem, ob der untere oder obere Bildschirmrand "ueber- 
schritten" wurde) BASIC-Zeile automatisch gelistet, was die 
Korrektur von Programmen erheblich vereinfacht. Diese Art 
des Scrollens ist allerdings auch nur waehrend der Programm- 


60 


entwicklung verwendbar. Bei der Ausfuehrung eines Programms 
muessen andere Moeglichkeiten vorhanden sein. 


Beim Scrolling, das der VIC-II-Chip des Commodore 64 unter- 
stuetzt, handelt es sich jedoch um ein Scrolling, das den 
Bildschirminhalt in einzelnen Punktzeilen, aus dem die LCon- 
putergraphiken aufgebaut sind, verschiebt, wohingegen das 
normale BASIC-Scrolling immer um ganze Zeichen - bestehend 
aus acht Punktzeilen - verschiebt (anders ist dies in BASIC 
ja auch nicht sinnvoll). 


Diese Moeglichkeit des Video-Chips kann dazu benutzt werden, 
Daten und Informationen an den Benutzer langsam auf dem 
Bildschirm erscheinen zu lassen. Waehrend der vVIC-II-Chip 
dazu jedoch schon einen erheblichen Beitrag leistet, indem 
er das Scrollen innerhalb eines Bereichs von acht Rasterzei- 
len erledigt, so muss das eigentliche Scrollen um acht Ra- 
sterzeilen (also um ein ganzes Zeichen) durch ein getrenntes 
Maschinenprogramm selbst erfolgen. 


Hier erst einmal das Prinzip des sogenannten "Smooth 
Scrolling" in der Theorie: 


Da die Daten, die auf den Bildschirm gescrollt werden sol- 
len, langsam erscheinen und zeitweilig nur teilweise sicht- 
bar sind (genauso wie die Zeichen, die langsam verschvin- 
den), wird eine Pufferzone benoetigt, die die neuen Daten 
aufnimmt und dann nach und nach auf den Bildschirm gebracht 
wird. Diese Pufferzone in Form einer unsichtbaren Zeile oder 
Spalte erhaelt man, indem man den Bildschirm einfach ver- 
kleinert. Dieses ist bereits durch den VIC-II-Chip vorgese- 
hen. Soll in horizontaler Richtung verschoben werden, so 
kann der Bildschirm einfach auf eine Breite von 38 Zeichen 
verkleinert werden. Ebenso ist es moeglich (bei vertikaler 
Verschiebung des Bildschirminhalts), eine Verkleinerung auf 
24 Zeilen zu erreichen. Es existieren nun "geschuetzte" Zei- 
len, die nicht gesehen werden koennen (aber fuer den Compu- 
ter immer noch vorhanden sind), da die Umrahmung nun eine 
groessere Flaeche als zuvor einnimmt. 


Die noch sichtbare Flaeche kann nun (je nachdem was verklei- 
nert wurde) um jeweils acht Punktzeilen (wird durch drei 
Bits in einem Register des Video-Chips festgelegt) verscho- 
ben werden. Bei einem Extremvert (null oder sieben, je nach 
Richtung) ist gerade eine Zeile (oder gar keine) des neuen 
Zeichens zu erkennen, beim anderen Extremvert (sieben oder 
null, je nach Richtung) das gesamte Zeichen (oder sieben 
Zeilen davon). 


Nach der Verkleinerung des Bildschirms wird zuerst das Regi- 
ster fuer die einzelnen Zeilen auf den Maximal- oder Mini- 
malwert gebracht (richtungsabhaengig, siehe Uebersicht). 
Dann werden die neuen Daten "unter" dem Rand (also dorthin, 
vo nur eine oder gar keine Punktzeile des Zeichens zu erken- 
nen ist) plaziert. Darauf erfolgt die Verminderung/Erhoehung 
des Registers, das fuer die Einzelzeilenverschiebung zu- 
staendig ist. Ist der Minimal- beziehungsweise Maximalwert 
erreicht, so wird das Maschinenprogramm aufgerufen. Es ver- 
schiebt nun den Bildschirminhalt wirklich (also nicht nur 
scheinbar gemaess der Darstellung) und setzt sofort darauf 
das Einzelzeilenregister wieder auf den Anfangsvwert zurueck, 
so dass wieder neue Daten plaziert werden koennen. 


Die Verkleinerung auf eine Breite von 38 Zeichen je Zeile 


(nur scheinbar!!!) erfolgt durch Loeschen von Bit 3 in Regi- 
ster 22 (Adresse 53270) des VIC-II-Chips. Bit 3 von Register 


61 


17 (Adresse 53265) dient entsprechend zur vertikalen 
Schrumpfung des Bildschirms auf 24 Zeilen. 


Die Einzelzeilenregister zu je drei Bits (fuer acht ver- 
schiedene Werte) befinden sich jeweils in den Bits 0 bis 2 
von Register 22 (Adresse 56270) fuer die Verschiebung in 
X-Richtung sowie Register 17 (Adresse 53265) fuer eine 
Y-Verschiebung. 

Hier eine Uebersicht, welche Register in welcher Weise be- 


einflusst werden muessen, um eine Verschiebung in eine be- 
stimmte Richtung zu erreichen: 


m u m m m En m ab ED TE CE m ED TE CE EB ER ER ab a Ep Em CE EC ET > CE TE > ES u CD GE m En «ED CE EB <ED Em ED ED CD ED «ES En m CED Cm mp am 
= 2 m ab CD CD CD CD ED CD m eb ED a am ED CE ED ED > m a ED En CED ED de CE ED ED CE ED Cup ED ED ED CED CED «ED GEB mb air dED mr CED «ED MED CAD CE GES (E> um am dm 
m— m mm ED CE ED ED CD CD TE Em ED CE CD CD ED TR ED CE m TE TE En CD U Cu ED En CE TE En EEE u ED Ep ED CE EEE EB ED EU GE GE CE ED a Cum 


I Scrollregister I Y I Y I X I X I 
lanfanguert IT I oO ı 7 rı0o1 
I Veraenertug I 1 I A I 1. 1 
I Pufferrend I unten I oben I rechts I links I 


Befindet sich der Wert null (als Anfangsvert) in einem 
Scrollregister, so ragt unter dem Pufferrand (fuer neue Da- 
ten) genau eine Punktzeile hervor. Wurde der Wert sieben in 
eins der Scrollregister (ebenfalls als Anfangsvert) ge- 
schrieben, so ist das ganze Zeichen (unter dem Pufferrand) 
unsichtbar. Entsprechendes gilt fuer die Endwerte und 
Pufferraender, in denen die Daten verschwinden. 


Hierzu ein Beispiel: Es soll ein auf dem Bildschirm stehen- 
der Text von unten nach oben Totiert werden, ohne dass neue 
Daten zugefuehrt werden. 


Es wird eine Maschinenroutine benoetigt, die den Bildschirm- 
inhalt um eine Zeichenzeile nach oben verschiebt und die 
obere Zeile dann wieder nach unten kopiert (dies entspricht 
einem Rotieren des Bildschirminhalts). 


Allerdings wird man bemerken, dass es damit allein nicht ge- 
tan ist; wird naemlich das Einzelzeilenregister geaendert 
(oder die Maschinenroutine aufgerufen), so wird man bemer- 
ken, dass es zu einem Flackern auf dem Bildschirm kommt. 
Dies liegt daran, dass es waehrend der Erstellung des Bildes 
auf dem Bildschirm zu einer Aenderung der Darstellungsvweise 
beziehungsweise der Daten kommt. Ein Teil des Bildes wird 
nach den alten Daten erstellt, ein anderer Teil nach neuen 
Daten. Dies gilt es zu verhindern. Waehrend das aber bei der 
Einzelzeilenverschiebung noch recht einfach ist, so bereitet 
es bei der Zeichenverschiebung schon Schwierigkeiten, da 
auch Maschinenprogramme, wenn sie auch noch so schnell sind, 
im Verhaeltnis zu der Zeit bei der Bilderstellung nicht 
schnell genug sind. 


Allerdings wurde dieses Flackern durch Abfrage des Raster- 
zeilenregisters umgangen. Die Aenderung der Bildschirmdaten 
erfolgt so, dass es nicht zu einer Ueberlappung (und damit 
zu einem Flackern) kommen kann. Dies war aber nur durch An- 
wendung einer nicht sehr eleganten Methode moeglich. Aber 


62 


schliesslich kam es hierbei auf Geschwindigkeit an. Hier das 
fertige Programm: 


100 FOR I = 828 TO 927 : READ A : POKE I, A : NEXT 

110 DATA 120, 169, 251, 205, 18, 208, 208, 251, 206, 17, 208 
120 DATA 88, 96, 120, 173, 17, 208, 16, 251, 72, 173, 17 

130 DATA 208, 48, 251, 169, 107, 205, 18, 208, 208, 251, 160 
140 DATA 40, 185, 255, 3, 153, 255, , 136, 208, 247, 185, 40 
150 DATA 4, 153, , 4, 200, 208, 247, 185, 40, 5, 153, „5 
160 DATA 200, 208, 247, 185, 40, 6, 153, , 6, 200, 208, 247 
170 DATA 160, 64, 185, 232, 6, 153, 192, 6, 200, 208, 247 
180 DATA 160, 39, 185, , 1, 153, 192, 7, 136, 16, 247, 104 
190 DATA 9, 7, 141, 17, 208, 88, 96 

200 POKE 53265, PEEK (56265) AND 240 OR 7 : C = PEEK (646) 


210 FOR I = 55296 TO 56295 : POKE I, C : NEXT : N = 63 
300 FOR I = 0 TO 6 : FOR J = O0 TON : NEXT : SYS 828 : NEXT 
310 FOR J = 0 TO.N : NEXT : SYS 841 : GOTO 300 


In Zeile 100 wird das Maschinenprogramm in den Bereich des 
Cassettenpuffers eingelesen, da dieser normalerweise unbe- 
nutzt ist (das Programm enthaelt jedoch keinerlei Absolut- 
adressen und kann daher auch an jeder anderen Stelle im Ar- 
beitsspeicher stehen). Die Daten fuer das Maschinenprogramm 
stehen in den Zeilen 110 bis 190. Zwei aufeinanderfolgende 
Kommas entsprechen uebrigens dem Wert null. Zeile 200 ver- 
kleinert den Bildschirm auf 24 Zeilen und stellt die momen- 
tane Cursorfarbe fest. Mit dieser Farbe wird nun das gesamte 
Farb-RAM gefuellt. Mancher ahnt, was es damit auf sich hat: 
Die Maschinenroutine verschiebt lediglich den Inhalt der Vi- 
deomatrix im Bereich von 1024 bis 2023. Das Farb-RAM und 
auch die Tabelle der Doppelzeilenkennzeichnungen (!) bleibt 
unbeachtet, da dadurch die Routine zu langsam wuerde. Daher 
sollte (wenn auf dem Bildschirm Programmzeilen verschoben 
wurden) nach Abbruch auf jeden Fall der Bildschirm geloescht 
verden, da es, -venn solche Programmzeilen editiert werden, 
zu Techt. merkwuerdigen Effekten kommen kann. 


Die Variable N ist der Wert fuer die Geschwindigkeit (Ver- 
zoegerungsschleife). Dann wird der Bildschirm in sieben 
Schritten jeweils um eine Punktzeile verschoben, wozu die 
Routine ab der Adresse 828 dient. Sie wartet mit dem Vermin- 
dern des Einzelzeilenregisters ab, bis es zu keinem flackern 
kommen kann. Die Routine ab Adresse 841 verschiebt den Bild- 
schirminhalt um eine Zeile nach oben und setzt das Einzel- 
zeilenregister wieder auf den Anfangsvert zurueck. Auch hier 
wird durch eine entsprechende Abfrage ein Flackern verhin- 
dert. 


Soll dieses Programm so abgeaendert werden, dass jeweils 
neue Daten nachgefuellt werden, so muss nach Aufruf der Ver- 
schieberoutine (SYS 841) die letzte Zeile mit den neuen Da- 
ten gefuellt werden (achten Sie darauf, dass der Cursor 
nicht ueber die letzte Zeile hinausfaehrt). Sind die neuen 
Daten "unter" dem Bildschirmrand plaziert, so kann wieder 
mit Zeile 300 fortgefahren werden. 


Die folgenden Programme entsprechen dem obigen Programm, nur 
wird jeweils in eine andere Richtung verschoben. Auch jedes 
dieser Programme besteht aus zwei Teilen: ab Adresse 82B zum 
Aendern des Einzelzeilenregisters sowie ab Adresse 84] zum 
Verschieben um ein ganzes Zeichen. Lediglich beim Verschie- 
ben des Bildschirminhalts nach UNTEN kam es zu zeitlichen 
Problemen. Da hier der Bildschirminhalt von unten nach oben 
geaendert werden muss (im Gegensatz zu den uebrigen Program- 
men, die den Bildschirm von oben nach unten aendern), ist es 
hier nicht mehr moeglich, die Bildaenderung so zu steuern, 


63 


dass diese nicht vom Zeilenstrahl "ueberholt" wird. So exi- 
stieren zwei Einsprungstellen: die erste an der Stelle 850. 
Hierbei kommt es zu einem Flackern, das jedoch durch geeig- 
nete Abfragen auf ungefaehr die vier unteren Bildschirmzei- 
len begrenzt werden kann. Die zweite Einsprungstelle befin- 
det sich an der Adresse B4l. Hier wird nun der Bildschirm 
"abgeschaltet" (siehe SCREEN BLANKING). Es sollte jedoch bei 
Verwendung dieser Einsprungstelle die Farbe fuer den Rahmen 
identisch mit der des Hintergrunds sein, da dann das Ab- 
schalten am wenigsten stoert. 


Scerolling nach LINKS: 


100 FOR I = 828 TO 927 : READ A : POKE I, A : NEXT 

110 DATA 120, 169, 251, 205, 18, 208, 208, 251, 206, 22, 208 
120 DATA 88, 96, 120, 173, 17, 208, 16, 251, 173, 17, 208 
130 DATA 48, 251, 169, 60, 205, 18, 208, 208, 251, 162, 39 
140 DATA 134, 251, 232, 134, 253, 162, 3, 134, 252, 134, 254 
150 DATA 24, 162, 25, 160, 217, 177, 251, 72, 177, 253, 145 
160 DATA 251, 200, 208, 249, 136, 104, 145, 253, 165, 251 
170 DATA 105, 40, 133, 251, 165, 252, 105, , 133, 252, 165 
180 DATA 253, 105, 40, 133, 253, 165, 254, 105, , 133, 254 
190 DATA 202, 208, 213, 173, 22, 208, 9, 7, 141, 22, 208, 88 
200 DATA 96 

300 POKE 53270, PEEK (53270) AND 240 OR 7 : CE = PEEK (646) 


310 FOR I = 55296 TO 56295 : POKE I, C : NEXT : N = 63 
320 FOR I = 0 T0 6 :: FOR J = 0 TO N : NEXT : SYS 828 : NEXT 
330 FOR J = 0 TO N : NEXT : SYS 841 : GOTO 320 


Scrolling nach RECHTS: 


100 FOR I = 828 TO 927 : READ A : POKE I, A : NEXT 

110 DATA 120, 169, 251, 205, 18, 208, 208, 251, 238, 22, 208 
120 DATA 88, 96, 120, 173, 17, 208, 16, 251, 173, 17, 208 
130 DATA 48, 251, 169, 73, 205, 18, 208, 208, 251, 162, 255 
140 DATA 134, 251, 232, 134, 253, 162, 3, 134, 252, 232, 134 
150 DATA 254, 24, 162, 25, 160, 39, 177, 253, 72, 177, 251 
160 DATA 145, 253, 136, 208, 249, 104, 145, 253, 165, 251 
170 DATA 105, 40, 133, 251, 165, 252, 105, , 133, 252, 165 
180 DATA 253, 105, 40, 133, 253, 165, 254, 105, , 133, 254 
190 DATA 202, 208, 214, 173, 22, 208, 41, 248, 1l4l, 22, 208 
200 DATA 88, 96 

300 POKE 53270, PEEK (53270) AND 240 : C = PEEK (646) 


310 FOR I = 55296 10 56295 : POKE I, C : NEXT : N = 63 
320 FOR IT =0T06 : FOR J =0 TO N : NEXT : SYS 828 : NEXT 
330 FOR J = 0 TO N : NEXT : SYS 841 : GOTO 320 


Scrolling nach UNTEN: 


100 FOR I = 828 TO 924 : READ A : POKE I, A : NEXT 

110 DATA 120, 169, 251, 205, 18, 208, 208, 251, 238, 17, 208 
120 DATA 88, 96, 120, 173, 17, 208, 41, 239, 141, 17, 208 
130 DATA 120, 160, 39, 185, 192, 7, 153, ,„ 1, 136, 16, 247 
140 DATA 185, 192, 6, 153, 232, 6, 136, 208, 247, 136, 185 
150 DATA 193, 5, 153, 233, 5, 136, 208, 247, 136, 185, 194 
160 DATA 4, 153, 234, 4, 136, 208, 247, 160, 195, 185, 255 
170 DATA 3, 153, 39, 4, 136, 208, 247, 160, 39, 185, , 1 
180 DATA 153, , 4, 136, 16, 247, 173, 17, 208, 4l, 248, 9 
190 DATA 16, 14l, 17, 208, 88, 96 

300 POKE 53265, PEEK (53265) AND 240 : C = PEEK (646) 

310 FOR I = 55296 TO 56295 : POKE I, C : NEXT : N = 63 

320 FOR I =0T06 : FOR J = 0 TON : NEXT : SYS 828 : NEXT 
330 FOR J = 0 TON : NEXT : SYS 841 : GOTO 320 


64 


Register 


Register 


Register 
bis 
Register 


Register 


Register 


Register 


Register 


Register 


Register 


17: 


18: 


19: 


20: 


21: 


Registeruebersicht fuer den VIC-II-Chip: 


Die Adresse eines Registers errechnet sich aus 
der Summe der Registernummer und der Start- 
adresse 53248. 


enthaelt die acht niedervwertigen der insgesamt 
neun Bits der X-Koordinate von Sprite #0. Das 
hoechstwertige Bit befindet sich in Bit 0 von 
Register 16. 


enthaelt die Y-Koordinate von Sprite #0. Hierzu 
exisitiert kein weiteres Bit, da nur acht Bits 
zur Darstellung der Y-Koordinate benoetigt ver- 
den. 


diese Register haben paarweise die gleiche Be- 
deutung wie die Register 0 und 1, jedoch je- 
weils fuer Sprite #1 bis Sprite #7. 


hier befinden sich die acht hoechstvertigen 
Bits der X-Koordinaten der Sprites. Dabei ist 
jedem Sprite das jeweilige Bit mit der Nummer 
des Sprites zugeordnet. 


Bits 0 bis 2 enthalten den Wert der vertikalen 
Verschiebung des Bildschirms in Rasterzeilen 
(siehe Scrolling). 

Ist Bit 3 geloescht, so werden nur noch 24 Zei- 
len des Bildschirms dargestellt, ansonsten alle 
25 Zeilen. 

Ein Loeschen von Bit 4 bewirkt das Ausfuellen 
des gesamten Bildschirms mit der Farbe des Rah- 
mens (Bildschirm "ausschalten"). 

Bit 5 schaltet (wenn gesetzt) in den Bit Map 
Modus um. 

Bit 6 schaltet (wenn gesetzt) in den Extended 
Color Mode (Modus fuer erweiterte Hintergrund- 
farben). 

Bit 7 ist das hoechstwertige Bit der neun Bits 
des Rasterregisters. 


Rasterregister (zusammen mit Bit 7 aus Register 
17). Wird das Register gelesen, so wird die mo- 
mentane Rasterzeile (die auf dem Bildschirm 
dargestellt wird) ausgelesen. Beim Schreiben 
wird der geschriebene Wert in einen internen 
Zwischenspeicher uebertragen, der dann zum 
Ausloesen eines IRQs verwendet wird. 


X-Koordinate der Position des Zeilenstrahls 
beim Ausloesen einer negativen Flanke auf dem 
Lightpen-Input (die acht hoechstwertigen der 
neun Bits). 


vie Register 19, aber Y-Koordinate 
Sprite Enable. Jedem Sprite ist ein Bit (der 
Nummer entsprechend) zugeordnet. Ist das Bit 


gesetzt, so ist dieses Sprite aktiviert ("ein- 
geschaltet"). 


65 


Register 22: 


Register 


Register 


Register 


Register 


Register 


Register 


Register 


Register 


Register 


Register 


Register 


23: 


24: 


25; 


26 


21% 


28: 


29: 


30: 


31: 


32: 


33; 


Bits O bis 2 enthalten den Wert der horizonta- 
len Verschiebung des Bildschirms in Rasterzei- 
len (siehe Scrolling). 

Ist Bit 3 geloescht, so werden nur noch 38 
Spalten des Bildschirms dargestellt, ansonsten 
alle 40 Spalten. 


. Bit 4 schaltet (wenn gesetzt) in den Multicolor 


Modus um. 

Bit 5 ist das Reset-Bit und muss bei der lIlni- 
tialisierung geloescht werden, da . ansonsten 
keinerlei Operationen von Seiten des 
VIC-II-Chips durchgefuehrt werden. 


Sprite Y-Expand. Wird ein Bit gesetzt, so wird 
das zugehoerige Sprite in doppelter Breite dar- 
gestellt. 


Bits 1 bis 3 legen die Startadresse des Zei- 
chengenerators fest. 

Im Bit Map Modus gibt Bit 3 jedoch die Start- 
adresse der Bit Map an. 

Durch Bit 4 bis 7 wird die Startadresse der Vi- 
deomatrix (Bildschirmspeicher) festgelegt. 


Interrupt Flag Register: 

Bit O0: Rasterregister 

Bit 1: MOB-DATA Kollision: 

Bit 2: MOB-MOB Kollision 

Bit 3: Lightpen 

Ist ein Bit gesetzt, so ist die zugehoerige Be- 
dingung erfuellt. Wird eine Eins in eine Bitpo- 
sition geschrieben, so wird das Bit geloescht. 
Bit 7 ist gesetzt,. falls mindestens eins der 
Bits von O bis: 3 zusammen mit seinem Enable Bit 
gesetzt ist. 


Interrupt Enable Register: 

Belegung wie oben (Bit 7 unbenutzt). Zugehoeri- 
ges Bit gibt an, ob die Interruptquelle einen 
IRQ ausloesen kann. 


MOB-DATA Prioritaetsregister: Ist das zum 


'Sprite gehoerige Bit gesetzt, so besitzt das 


Sprite eine niedrigere Prioritaet als der Vor- 
deryrund. 


MOB-Multicolor: Bei gesetztem Bit wird das zu- 
gehoerige Sprite im Multicolor-Modus darge- 
stellt. 


Sprite X-Expand. Wird ein Bit gesetzt, so wird 
das zugehoerige Sprite in doppelter Hoehe dar- 
gestellt. 

MOB-MOB Collision: zum MOB gehoeriges Bit wird 
gesetzt, falls Beruehrung mit anderem MOB er- 
folgte. 

MOB-DATA Collision: zum MOB gehoeriges Bit wird 
gesetzt, falls Beruehrung mit Vordergrunddaten 
erfolgte. 

Exterior Color (Rahmenfarbe) 


Background Color #0 (Standard HNintergrundfarbe) 


66 


Register 34: Background Color #1 bis Background Color #3, 
bis veitere Hintergrundfarben fuer andere Darstel- 
Register 36: lungsmodi. 


Register 37: enthalten die Farben zur Darstellung von Multi- 
Register 38: color Sprites. 


Register 39: Jedes Register enthaelt eine Farbe zur Darstel- 
bis je eines Sprites (von Nummer 0, Register 39 bis 
Register 46: Nummer 7, Register 46). 


Bei Farbregistern (Register 32 bis 46) ist jeweils nur das 
untere Nybble (Bit O bis Bit 3) benutzt. 


Nichtaufgefuehrte Bits sind unbenutzt. Unbenutzte Bits ent- 
halten den Wert eins. 


Die Farben des VIC-II-Chips 


Der Video-Chip verfuegt ueber die Moeglichkeit der Darstel- 
lung von sechzehn Farben. Diese Farben werden in Form von 
Farbcodes sowohl in den Farbregistern als auch im Color- 
Nybble-RAM verwendet. Hier eine Uebersicht ueber alle farben 
und wie sie ueber die Tastatur erreicht werden koennen 
(PRINT): 


Farbcode Farbe Tastatur 
0 schwarz Control - 1 
1 weiss Control - 2 
2 rot Control - 3 
3 cyan (tuerkis) Control - 4 
4 violett Control - 5 
5 gruen Control - 6 
6 blau Control - 7 
7 gelb Control - 8 
8 orange Commodore - ] 
9 braun Commodore - 2 
10 rosa Commodore - 3 
11 hellgrau Commodore - 4 
12 mittelgrau Commodore - 5 
13 hellgruen Commodore - 6 
14 hellblau Commodore - 7 
15 dunkelgrau Commodore - B 


Ist der Multicolor Modus eingeschaltet (bei Zeichendarstel- 
lung), so stehen nur die ersten acht Farben fuer Zeichen zur 
Verfuegung. 


67 


Die 


Pin 
Pin 
Pin 
Pin 
Pin 
Pin 
Pin 
Pin 
Pin 


Pin 


Pin 
Pin 
Pin 
Pin 
Pin 
Pin 
Pin 
Pin 
Pin 
Pin 
Pin 
Pin 


Pinbelegung des VIC-II-Chips (MOS 6567) 


- 7: 


Datenbus des Prozessors (Bit 6 bis Bit 0) 

IRQ/ Ausgang zum Prozessor 

Lightpen/ Eingang 

CS/ Chip Select, Zugriff auf Register des Chips 
R/W Schreib/Leseleitung des Prozessors, O=Write 
BA (Bus Available) Freigabe des Prozessorbus' 
VDD, Stromversorgung (+12 Volt) 

COLOR, Ausgang fuer Farbsignal 

SYNC, Ausgang fuer Synchronisationssignale 
AEC/, Kontrolle des Systembus' durch VIC 

PHO, Ausgang des Prozessortakts 

RAS/, Steuersignal fuer dynamische RAMs 

CAS/, Steuersignal fuer dynamische RAMs 

GND, Masseleitung 

PHCL, Eingang der Colorfrequenz 

PHIN, Eingang der Dotfrequenz 

All, Adressbus des Prozessors 

AO bis A5, AB bis Al3, gemultiplexter Adressbus 
A6 bis 10, Adressbus des Prozessors 

Datenbus fuer Zugriff auf Color Nybble RAM 
Datenbus des Prozessors (Bit 7) 

VCC, Stromversorgung (+5 Volt) 


Fr DÖHNFTGURAT ICH 
ER nn 
i u 3 b-, ILL 
33 DRT 
BD I DES 
37 PTIOB9 
357 0B1G 
35 DE11 
a4 ala 
330777993 
32 Ins 
os sser LH 
Zu Re 
&9 m 
28 7 IA ALZ 
27 Fnsni 1 
25 7 JRZrALG 
25 AL’R3 
24 Ra-R: 
FÄAS TDT]18 ER =: 
chE 13 22 FHIH 
GHO Dee 24 FTIFHCL 


SPFEFEITE-EHTLIURFSBILRTT 


SANTOS FION- NG 


En En DE DD a nt 


GLIIIIITITETTIETTTIT TH 
OL II TI III T IT TITTTTCTT 
Pa | U BE DE GR DR ER DE DR HE DE DR RR DR HR HR 
TE Te TI TTTrT 


SATIN TAUATIION-U CS 


need 


IE IR EEE DucG BE DU DR OU DER DR DE DR DR DER N HR DR DE ED 
SGANATIO-VO SAU TION-ONG 


Rn ee ee a er Tot] 


HE Da DE u EEE DER DU HER EN EN ER EN EN 
SU TIOL-ONETIN TIIOR- NS 


III I IT TUN | 
SANATIGNM-ONETOIAITITION- NS 


RD DT De aD n/a 


SEATTLE FRI TAUNITIANOT- HT 


need 


69 


BEDIENUNG DES SPRITE-GEHERRTORS 


Da=z Proaramm "SPRITE GENERRTOR" wandelt nach dem Start durch 
"RUN" ein in DATA-Zeilen kefindliches Muster der Groesse var 
21 Zeilen mal 24 Spalten in die entsprechenden Dezim=lwerte 
fuer die Definition eires Sprites um. Die Dezimalwerte wer- 
den automatisch in Proaranmzeilen mit DATA=E umgewandelt, de- 
ren erste Zeilennummer durch die Yariakle "L" und der Ak- 
stand zwischen dern Zeilen durch "5" beides in Zeile 1)» 
festselest werden. Es muss natuerlich darzauf wesachtet wer- 
den, dass die neuen Zeilernummern nicht das (rsprungsero- 
Sr anım vebkerschreiken. wern nach weitere Sprites kreiert wer— 
den sallen. 


Die Yariakle "FF" dekenf=lls in Zeile 1) least fest. ck das 
Muster als Standard- (F=1) oder Multicclor-Sprite «F=2> auf- 
gefasst merden scll. Im Standercdmadus entspricht ein Leer- 
zeichen dem Bitwert a und ein Asterisk '"%" einem wesetztenr 
Bit. Im Gesensatz dazu werden im Multicolarmodus immer zwei 
aufeinander falgende Zeichen behandelt. Sc entsprechen zwei 
Blanks dem Bitpazr "aa". "a4" entspricht "al", "++" wird in 
"1a" und "#4" in "11" umgewandelt. 


sSPEFEITE GEHERRTOR 


a REM ##4# SPRITE GENERATOR FÜR THE COMMODORE 84 ### 

1 L=199:5=10:F=1:PRINT" UM" :N=. :GOSUBRE :FORI=. TO2a:RERDA$ :FORI=. TOZ:R=. 
2 FORK=1TOSSTEPF :B=2%#B#F :C$=MNID$LA$ . T$S+K „FD s IFCH="K" ORCH=" #4" THENB=B+H1 
3 B=B-2%0C$=" ++") - IL C$="44") NEXT :P$="" Ss IFRTHENF$=MIDESESTRECRD „25 

4 IFPOS«. >+LEN<P$>>P7STHENPRINTCHRE 205 :GOSUBE 

S PRINTP3$" ." 3 :NEXT NEST :PRINTCHRS CZ" 3 :POKE19S.N:END 

& PRINTMID$S{STR$<LI . 27" DR" 7 :L=L+SsPOKES3S1+N. 13 :N=HN+1 RETURN 

1a DATR" FEEEREEN " 

11 DATA" FEFTETETETREN z 

12 DATA" FETTE TFT vi 

13 DATA" VERERRRERTTENTENTENE 


14 DATH" Ki ek" 
15 DATA" Be OR" 
16 DATA" Br" 
17 DATA ERREREEEEEEEEREEREEE "' 
18. DATA 5 
13 DATA KARRIERE “ 
2a DATA 2 


21 DATA BERRRRIEIEE . 
22 DATA ERREREEEE “ 
23 DATA" n 
24 DATA" ll = 
23 DATA" elek " 
26 DATR" Sek . 
27 DATR" EEE EC & 
28 DATR" EEE 2 
29 DATR" KERNE & 
38 DATA" RER > 
ERDY. 


70 


ABFRAGE UND BELEGUNG DER FUNKTIONSTASTEN 


Sowohl Commodore 64 als auch \IC-20 verfuegen ueber vier 
Funktionstasten, die zum Beispiel dıe Erstelluna von Pro- 
grammen wesentlich vereinfachen koennen. Auch ermoealichen 
sie eine bequeme und uebersichtliche Benutzerfuehrung durch 
Anvender- und Spielprogramme. Im folgenden die Erklaerung 
der praktischen Ausfuehrung dieser Moeglichkeiten: 


Abfrage der Funktionstasten 


Die Funktionstasten sind Tasten, deren ASCIIs im Bereich von 
133 bis 140 liegen. Dies sind Codes im Bereich der nicht- 
druckenden Steuercodes (siehe Tabelle), was Grund dafuer 
ist, dass das Druecken dieser Tasten keinerlei Wirkung 
zeigt. Lediglich innerhalb von Anfuehrungszeichen (im soge- 
nannten Quote-Modus) und nach dem Einfuegen von Leerzeichen 
durch "INSERT" (im Insert-Modus) werden Zeichen ausgegeben, 
abhaengig vom Darstellungsmodus entweder Balken oder \Vier- 
telkreise (im Grafikmodus) oder Buchstaben von "E" bis "L" 
(im Kleinschriftmodus), beide Male jedoch in Negativdarstel- 
lung. Dieses Verhalten ist aehnlich dem der Tasten zur Cur- 
sor- und Farbsteuerung. 


Um nun eine gedrueckte Funktionstaste in BASIC-Programmen zu 
erkennen, muss entsprechend der Abfrage von anderen Tasten. 
vorgegangen werden. Zum Beispiel so, wie im folgenden Pro- 
grammausschnitt: 


350 PRINT CHR$ (147) "Fl - SEGMENT A" 

360 PRINT : PRINT "F3 - SEGMENT B" 

370 PRINT : PRINT "BITTE 'Fl' ODER 'F3' DRUECKEN!" 
380 GET G$ : IF 6G$ = CHR$ (133) GOTO 500 

390 IF G$ C) CHR$ (134) GOTO 380 

400 REM SEGMENT B 


500 REM SEGMENT A 


Hier die Codes der Funktionstasten: 


Fl: 133 F3: 134 F5: 135 F7: 136 
F2: 137 Fa: 138 F6: 139 F8: 140 


Die Codes von 133 bis 136 verden beim Druecken der Funk- 
tionstaste alleine erzeugt, die ASCIIs von 137 bis 140 erge- 
ben sich beim gemeinsamen Druecken entweder mit einer SHIFT- 
Taste oder der COMMODORE-Taste. 


Belegung von Funktionstasten 


Unterschiedlich dazu ist die Vorgehensweise zum Belegen der 
Funktionstasten. Hierbei werden den Tasten bestimmte Texte 
oder Befehlsworte zugeordnet, die haeufig benoetigt werden. 
Bei Ausuebung dieser Funktion werden die Tasten auch als 
"Softkeys" bezeichnet. 


Das Belegen ist NUR durch Verwendung eines geeigneten Ma- 
schinenprogramms moeglich und NICHT ueber BASIC. Hierzu wird 
der Sprungvektor (655/656) geaendert, so dass auf ein eige- 
nes Maschinenprogramm verzweigt wird. Dieser Vektor wird in 
der Routine SCNKEY verwendet, die die Abfrage der Tastatur 
erledigt und normalerweise durch die Interruptroutine aufge- 
rufen wird. SCNKEY belegt den Bereich von 60039 bis #HN60N 
(siehe ROM-Listing). 


71 


Bei Erreichen des Sprungvektor (655/656) sind bereits die 
Adressen 203 und 653 auf den aktuellen Wert gesetzt worden. 
Erstere enthaelt den Tastaturmatrixcode von OD bis 64, (653) 
gibt an, welche Kombinationstasten gedrueckt sind (SHIFT, 
COMMODORE und CONTROL). 


Ist durch das zusaetzliche Maschinenprogramm nun festge- 
stellt worden, dass eine Funktionstaste gedrueckt wurde, so 
muss nun noch der Zustand der SHIFT-Flag geprueft werden. 
Daraus errechnet sich dann, velcher Text im Tastaturpuffer 
abgelegt werden soll. 


Dies wird durch das im Anschluss abgedruckte BASIC-Programm 
erledigt. Es legt das Maschinenprogramm zur Abfrage der 
Funktionstasten im Bereich ab Adresse 828 ab, kann jedoch 
auch in einen beliebigen anderen Bereich gelegt werden. 
Hierzu muss nur die Variable "S" geaendert werden. Der Be- 
ginn der Texttabelle wird durch "D" festgelegt. Sie ist in 
acht Eintraege zu je zehn Bytes aufgeteilt, entsprechend 
"Fl" bis "F8". Die Belegungen koennen durch Aendern der 
letzten DATA-Zeile eigenen Anwendungen angepasst werden. Der 
Rueckwaertspfeil gibt an, ob die RETURN-Taste gedrueckt wer- 
den soll. Die Laenge des Textes darf zehn Buchstaben nicht 
ueberschreiten. 


Nach Ausfuehrung des Programms durch "RUN" wird die ervei- 
terte Tastaturabfrage automatisch aktiviert. Jedoch wird 
Vektor (655/656) beim Druecken von "RUNSTOP" und "RESTORE" 
wieder auf den Normalwert gesetzt, so dass eine Neuaktivie- 
rung notwendig ist. Dies erfolgt durch einen "SYS" mit der 
Zahl als Argument, die beim Start des Programms ausgegeben 
wurde. 


iaa REM ## FUHCTICH KEYS FÜR THE COMMODORE 84 & THE VIC2a ## 
11a 5 = 828 ; D= 312 : FOR IT =5 TOS + S3 : RERD R 
v 


12a POKE I. R =: NE#T : POKE 5 + 74. S - 2565 # INT (S / 256) 
13a FPOKE S + 76. S .* 256 : PÜKE S + 4 D .’ 256 
i4&@ POKE 5 + 45. DO - 256 # INT iD 2 


15a FOR I = a TO 7 : RERD A$ : FOR IT 
18a B = ASC KMID$ {A#, I. 125 : IFB 
iva FKED + I # 14 + T- 1.B : NEXT 
isa IF I <> 11 THEN POKE OD + I #19 + T-1,0 

128 NEXT =: FRINT 5 + 73 : SYS S + 73 

2aa DATA 184. 203, 1968. 197, 208, il, 44, 259, 255. 16, 3 
ia DATA 76, 220. 235, 76. 72, 235. 177, 245. 201. 137, 176 
eza DATA 239, 233. 132. 144. 235. 168, 173, 141, 2. 74. 152 
23a DATA 42. 133, 197. 18. 18. 1al, 197, 1a, 168, 162, „ 185 
e4a DATA „. „ 240, 9, 157. 119. 2, 200. 232. 224, 18, 208 

esa DATA 242, 134. 198, 162, 255, 44, 25a, 255. 16. 3, 76 
esa DATA 186, 235, 76, 38, 235. 182. „ 160, „ 142, 143, 2 
era DATA 14a, 144, 2, 96 

sag DATR RUNe.GOTG,LISTr.?FRECBIe,POKE.PEEK« „THEN, INPUT 


> 
1 TO LEN &R$> 
95 THEN RB = 13 


72 


SOUNDERZEUGUNG MIT DEM COMMODORE 64 


Der Commodore 64 besitzt einen hochwertigen Soundbaustein, 
den MOS 6581, auch SID (Sound Interface Device) genannt. Mit 
diesem lassen sich Geraeusche fast aller Art erzeugen, Mu- 
sikstuecke spielen und Soundeffekte zum Beispiel in Spiele 
einbauen. Hier eine grobe Funktionsuebersicht: 


Der SID verfuegt ueber drei getrennte Soundgeneratoren (die 
miteinander synchronisiert oder ringmoduliert werden koen- 
nen) mit einem Frequenzbereich von O0 Hz bis ca. 4 kHz. Die 
Huellkurve (ADSR) eines jeden Tongenerators kann getrennt 
gewaehlt werden, ebenso die Wellenform, von der vier ver- 
schiedene (Dreieck, Saegezahn, Rechteck und Rausch) zur Aus- 
wahl stehen. Es steht ausserdem ein filter zur Verfuegung, 
mit dem die drei Tongeneratoren sowie eine externe Signal- 
quelle verfremdet werden koennen. Der dritte Tongenerator 
kann ausserdem durch zwei weitere Register kontrolliert ver- 
den: Eines gibt die Huellkurve und damit die Amplitude an, 
das zweite Register kann zur Modulation der anderen beiden 
Soundgeneratoren oder zum Beispiel zur Erzeugung von Zu- 
fallszahlen dienen. 


Jeder der drei Tongeneratoren kann durch folgende Parameter 
gesteuert werden: 


Frequenz: Die Frequenz wird durch einen Wert einer Breite 
von 16 Bits festgelegt und wird daher durch zwei Register 
(je Stimme) bestimmt. Dadurch existieren 65536 verschiedene 
Tonhoehen. Die Frequenz errechnet sich dabei wie folgt: 


F=-NnN*+c/ 2 t 24 


Dabei ist N die 16-Bit-Zahl, C die Systemtaktfrequenz und F 
die effektive Frequenz (die letzteren beiden Angaben in 
Hertz). Um zum Beispiel einen Ton einer bestimmte Frequenz 
erklingen zu lassen, kann prinzipiell folgendermassen vorge- 
gangen werden: 


14318180 / 14 : IF PEEK (678) THEN C = 17734472 / 18 


30C = 
310Q=2 24 /C 
320?N=F *Q : HI = INT (N / 256) : LO = N - 256 * HI 


Wie ersichtlich, sollten hier, wie bei anderen Gelegenheiten 
auch, die verschiedenen Taktfrequenzen der verschiedenen Ge- 
raete beachtet werden, da die Taktfrequenz nicht exakt ein 
MHz betraegt. Die Variablen "LO" und "HI" enthalten nach 
Ausfuehrung nun das LSB und MSB fuer die beiden Register zur 
Festlegung der Frequenz. Die Frequenz laesst sich in 
Schrittweiten von ungefaehr 0.06 Hz festlegen. 


ADSR-Funktion: Durch diese aus vier Parametern bestehende 
Funktion wird der Lautstaerkeverlauf gesteuert. Der erste 
Parameter (A, ATTACK) gibt die Zeitspanne an, in der der Ton 
die hoechste Lautstaerke erreicht haben soll. Ist diese 
Zeitspanne vorueber, so wird der DECAY-Zyklus eingeleitet. 
Durch diesen zweiten Parameter wird die Zeitspanne festge- 
legt, in der der Ton auf die durch den Parameter SUSTAIN 
festgelegte Lautstaerke zurueckfaellt. Diese Lautstaerke 
wird nun solange gehalten, bis durch Loeschen einer bestimm- 
ten Flag RELEASE beginnt. Der RELEASE-Parameter gibt, aehn- 
lich wie bei DECAY auch, die Zeitspanne an, innerhalb der 
der Ton auf die Lautstaerke 0 zurueckgegangen sein soll. 


Durch diese Funktion laesst sich der Klang der verschieden- 
sten Instrumente imitieren. 


73 


Graphisch laesst sich diese ADSR-Funktion wie folgt darstel- 
len: 


ATTACK 


Als Zeitspannen von ATTACK, DECAY und RELEASE stehen folgen- 
de Moeglichkeiten zur Auswahl: 


Wert ATTACK-Spanne DECAY/RELEASE-Spanne 


0 0.002 sec 0.006 sec 
l 0.008 sec 0.024 sec 
2 0.016 sec 0.048 sec 
3 0.024 sec 0.072 sec 
4 0.038 sec 0.114 sec 
5 0.056 sec 0.168 sec 
6 0.068 sec 0.204 sec 
7 0.08 sec 0.24 sec 
8 0.1 sec 0.3 sec 
9 0.25 sec 0.75 sec 
10 0.500 sec 1.9 sec 
11 0.800 sec 2.4 sec 
12 1 sec 3 sec 
13 3 sec 9 sec 
14 5 sec 15 sec 
15 8 sec 24 sec 


Auch wenn fuer DECAY und RELEASE die gleiche Einteilung vor- 
handen ist, so lassen sich diese beiden Parameter natuerlich 
unterschiedlich waehlen. Jedoch beziehen sich auch diese An- 
gaben wieder auf eine Taktfrequenz von einem MHz. Sollte ei- 
ne genaue Angabe der wirklichen Zeitspanne erforderlich 
sein, so sind die obigen Werte mit dem faktor ... 


l MHz / Systemtaktfrequenz 
zu multiplizieren. 


Als eine weitere Moeglichkeit der Beeinflussung der einzel- 
nen Stimmen steht die Wellenform zur Verfuegung. An Wellen- 
formen stehen vier verschiedene zur Auswahl: die Dreieck- 
Wellenform, die Saegezahn-Wellenform, die Pulse-Wellenform 
sovie die ”"Wellenform" Rausch, die beispielsweise fuer Ex- 
plosionen, Wind und Schlagzeug genutzt werden kann. 


Dreieck Saegezahn Pulse 


ZINN ZN TR) 


"Rausch" liefert ein Signal in Form eines Rauschens, dessen 
Frequenzen innerhalb eines bestimmten Bereichs liegen. 


74 


Die Wellenform "Pulse", auch Rechteckschwingung genannt, 
kann ausserdem noch durch die Pulsebreite variiert werden. 
Dieser Wert mit einer Breite von 12 Bits im Bereich von OD 
bis 4095 (die Randverte allerdings bewirken, dass kein Ton 
ausgegeben wird) gibt an, wie lange das Signal den Nullpegel 
annehmen soll. Ist also ein Wert von 2048 gewaehlt, so er- 
haelt man eine exakt regelmaessige Rechteckschwingung. Durch 
Aendern der. Pulsebreite (waehrend der Ton erklingt) koennen 
klangliche Veraenderungen (ein sogenanntes "Phasing") er- 
zeugt werden. Ist eine andere Wellenform als Rechteck ausge- 
waehlt, so hat die Angabe einer Pulsebreite keinerlei Aus- 
wirkungen auf die Tonerzeugung. 


Jede Stimme besitzt sieben Steuerregister (von den insgesamt 
29 Registern des SID) zur Kontrolle. Die ersten beiden Regi- 
ster eines der drei Bloecke (fuer jeden Oszillator) bestim- 
men die Frequenz der Stimme. Dabei handelt es sich um den 
unter "Frequenz" beschriebenen 16-Bit-Wert, der in der Rei- 
henfolge LSB/MSB in den beiden Registern abgelegt wird. 


Die folgenden beiden Register sind fuer die Angabe der 
Pulsebreite verwendet. Da diese jedoch nur 12 Bits benoe- 
tigt, ist das MSN des zweiten Registers unbenutzt. Das erste 
enthaelt die Bits O bis 7, das LSN des zweiten Registers Bit 
8 bis Bit 11. 


Bei den Registern 4, 11 und 18 (je nach Tongenerator) han- 
delt es sich um die Steuerregister fuer den Ablauf der 
Huellkurve (darauf wird im folgenden noch eingegangen). Die 
Bits 4 bis 7 waehlen die Wellenform aus. Ist ein bestimmtes 
Bit gesetzt, so wird die entsprechende Wellenform fuer den 
Tongenerator verwendet. Auch ist es moeglich, mehrere Bits 
gleichzeitig zu setzen. Allerdings resultiert die dabei ent- 
stehende Wellenform aus einer "UND"-Verknuepfung der ausge- 
vwaehlten Wellenformen. Hier eine Aufstellung, welches Bit 
welche Wellenform auswaehlt (sofern gesetzt): 


Bit 4: Triangle (Dreieck) 
Bit 5: Sawtooth (Saegezahn) 
Bit 6: Pulse (Rechteck) 

Bit 7: Noise (Rauschen) 


Durch das naechste Register (5, 12, 19) werden die Parameter 
ATTACK und DECAY festgelegt. Die Daten fuer ATTACK befinden 
sich im MSN, DECAY belegt das LSN. Der Wert kann also 
durch ... 


POKE 54272 + T*7+5, A* 16 + D 


PR abgespeichert werden, wobei 54272 die Basisadresse des 
SID ist, T der Tongenerator (von O bis 2) und A und D (je- 
veils von O bis 15) die Daten fuer ATTACK und DECAY enthal- 
ten. 


Das letzte tongeneratorspezifische Register dient zur fest- 
legung des SUSTAIN-Levels und der Zeitspanne fuer RELEASE. 
Die Laustaerke fuer SUSTAIN befindet sich im MSN, die 
RELEASE-Zeitspanne muss im LSN festgelegt werden. 


Alle diese Register koennen nur BESCHRIEBEN und NICHT ausge- 
lesen werden. Sollen also auf bereits festgelegten Parame- 
tern aufbauend andere Effekte erreicht werden, so muessen 
die Daten zusaetzlich im RAM abgelegt werden. Die Register 
befinden sich an den Adressen 54272 bis 54292. 


75 


Um nun einen Ton zu erzeugen, muss folgendermassen vorgegan- 
gen werden: Zuerst sollten die ADSR-Daten und die Frequenz 
(sowie, falls erforderlich, die Pulsebreite) abgespeichert 
werden. Ist dies erfolgt, so kann nun, gleichzeitig mit der 
Definition der Wellenform, der ADSR-Zyklus begonnen werden. 
Dies erfolgt durch Abspeichern eines Wertes in Register- 
adresse 54276, 54283 oder 54290 (tongeneratorabhaengig), in 
dem Bit O0 gesetzt ist. Bit 4 bis Bit 7 geben die Wellenform 
an. Ist der SUSTAIN-Level erreicht worden, so wird dieser so 
lange gehalten, wie das Bit O (GATE- oder KEY-Bit genamnt) 
gesetzt ist. Wird .es geloescht (die Bitkombonation fuer die 
Wellenform muss erhalten bleiben!), so wird RELEASE ausge- 
fuehrt. Ist der Nullevel erreicht worden, kann dem Register 
der Wert 0 zugewiesen werden. Wird das GATE-Bit geloescht, 
bevor DECAY abgeschlossen ist, so wird sofort RELEASE einge- 
leitet. Auch wird ATTACK begonnen, falls GATE gesetzt wird, 
unabhaengig davon, ob sich dieser Tongenerator vielleicht 
noch in der RELEASE-Phase befindet. Das GATE-Bit kann so zum 
Beispiel in Abhaengigkeit davon, ob eine bestimmte Taste ge- 
drueckt ist, gesetzt und geloescht werden, die Tastatur 
wuerde also zu einer Art Klaviatur umfunktioniert. 


Um jedoch ein hoerbares Ergebnis zu erzielen, muss die 
Hauptlautstaerke festgesetzt werden. Diese kann in 16 Stufen 
von O0 (kein Ton) bis 15 (hoechste Lautstaerke) durch das LSN 
von Register 24 variiert werden. 


Zurueck zum Kontrollregister, mit dem der ADSR-Zyklus ini- 
tialisiert und die Wellenform festgelegt wird: Bit 1 dient, 
falls gesetzt, zur Synchronisation der Grundfrequenzen ver- 
schiedener Oszillatoren. Dazu muss der Oszillator, nach dem 
synchronisiert wird, auf eine von null verschiedene Frequenz 
gesetzt werden, andere Register dieses Oszillators haben 
keinen Einfluss auf die synchronisierte Stimme. 


Ein Setzen von Bit 2 bevirkt, falls die Dreieck-Wellenform 
des entsprechenden Generators gewaehlt ist, dass der 0szil- 
latorausgang dieser Stimme durch ein durch Ringmodulation 
(Summe und Differenz der beiden Grundstimmen) kombiniertes 
Signal dieses und eines zweiten Generators ersetzt wird. 
Auch hier muss der zweite Generator eine von null verschie- 
dene Frequenz haben um einen Unterschied zur normalen Ausga- 
be zu erzielen. 


Bit 3 sperrt den entsprechenden Oszillator und fuehrt 
gleichzeitig einen RESET des entsprechenden Oszillators 
durch. Dies kann notwendig sein, wenn bei der Auswahl der 
Wellenformen NOISE mit einer weiteren Wellenform kombiniert 
wurde, da dann der Rauschgenerator blockieren kann. 


FILTER 


Register 21 und 22 bilden ein Register, das die fFilterfre- 
quenz bestimmt. Bit O0 bis 2 von Register 21 (Adresse 54293), 
Bit O bis 2 des 11 Bits breiten Werts, sowie alle Bits von 
Register 22 (Adresse 54294), Bit 3 bis 10 des Werts, bestim- 
men die Filterfrequenz. Diese errechnet sich durch ... 


F= (30 + N * 5.81) Hz 


Dabei ist N der 11-Bit-Wert und F die fFilterfrequenz in 
Hertz. Im Gegensatz zu anderen Werten ist dieser Wert unab- 
haengig von der Taktfrequenz. Als Filterarten stehen nun 
folgende Moeglichkeiten zur Auswahl: LOWPASS (alle Frequenz- 
komponenten des Signals UEBER der Filterfrequenz werden mit 
12 dB je Oktave abgeschwaecht), HIGHPASS (entsprechend Lov- 


76 


pass, jedoch werden alle Frequenzkomponenten des Signals 
UNTER der Filterfrequenz mit 12 dB/Oktave abgeschwaecht) so- 
wie BANDPASS (alle Frequenzkomponenten UNGLEICH der Filter- 
frequenz werden um 6 dB/Oktave vermindert). 


Die verschiedenen Ausgabesignale der Filter koennen durch 
gleichzeitiges Setzen der entsprechenden Bits additiv ver- 
knuepft werden. So kann durch Kombination von Lowpass und 
Highpass eine Bandsperre programmiert werden. Der Filter 
wird im allgemeinen dazu verwendet, um bestimmte Frequenzen 
eines Signals zu eliminieren. 


Ausserdem kann die Filterresonanz durch einen Wert von O0 
(keine Wirkung) bis 15 (hoechste Resonanz) im MSN von Regi- 
ster 23 festgelegt werden. Dies bewirkt eine besondere Beto- 
nung der Frequenzkomponenten der filterfrequenz woraus ein 
schrillerer Ton resultiert. 


Vier verschiedene Stimmen koennen ueber den Filter laufen: 
jeder der Oszillatoren ] bis 3 sowie ein externes Signal. 
Dieses externe Signal wird durch den Eingang "AUDIO IN" (Pin 
5) ueber die Audio/Video-Buchse zum SID geleitet. Soll eine 
dieser Stimmen durch den Filter modifiziert werden, so muss 
eines der Bits des LSN von Register 23 (Bits 0 bis 2 fuer 
Stimme 1 bis 3, Bit 3 fuer das externe Signal) gesetzt wver- 
den. Es ist moeglich, mehrere Stimmen gleichzeitig durch den 
Filter zu leiten. 


TONGENERATOR 3 


Stimme 3 (Register 14 bis 20, Adressen 54286 bis 54292) 
nimmt eine gesonderte Stellung innerhalb der drei Oszillato- 
ren ein. Hier kann der Verlauf der Huellkurve und der Zu- 
stand des Oszillators festgestellt werden. 


Huellkurve: Die Huellkurve (Register 28) gibt die momentane 
Amplitude der ADSR-Funktion an. Ist die durch das LSN von 
Register 24 festgelegte Lautstaerke nach Initialisierung des 
ADSR-Zyklus' (Setzen des GATE-Bits) erreicht worden (nach 
der ATTACK-Phase), so enthaelt dieses Register den Wert 255, 
nach RELEASE den Wert OD. So kann zum Beispiel, falls SUSTAIN 
eine festgelegte Zeitspanne gehalten verden soll, nach Ab- 
lauf dieser Zeitspanne automatisch RELEASE eingeleitet wver- 
den. Dazu muss lediglich gewartet werden, bis nach dem Er- 
reichen des Werts 255 das Huellkurvenregister den von 
SUSTAIN abhaengigen Inhalt hat. Dann wird die gewuenschte 
Zeitspanne gewartet, und nach Beendigung der Warteschleife 
das GATE-Bit geloescht. Auch kann so erkannt werden, wann 
RELEASE beendet ist, um das Kontrollregister (Register 4, 
1l, 18 sowie Adressen 54276, 54283, 54290) einer Stimme auf 
den Wert null zu setzen, um (sehr schwaches) Nachklingen zu 
vermeiden. Auch koennen durch dieses Register sehr winteres- 
sante Effekte erzielt werden, wenn in Abhaengigkeit vom Zu- 
stand der Huellkurve die Frequenz oder Pulsebreite geaendert 
wird. Auch durch Aendern der fFilterfrequenz sind viele wir- 
kungsvolle Effekte moeglich. 


Oszillator: Dieses Register (#27, Adresse 54299) gibt den 
Zustand der acht hoechstvertigen Bits von Oszillator > an. 
Der Registerinhalt aendert sich je nach gewaehlter Wellen- 
form. Bei der Wellenform "Dreieck" nimmt der Inhalt des 
Registers gleichmaessig von OD bis 255 zu. Ist der Wert 255 
erreicht worden, so wird dieser Wert nun wieder bis auf null 
vermindert, woraufhin wieder von vorne begonnen wird. "Sae- 
gezahn" laesst den Inhalt dieses Registers auch von 0 bis 
255 ansteigen, faellt nach Erreichen dieses Werts jedoch so- 


77 


fort wieder auf null zurueck. Ein staendiger Wechsel von O0 
auf 255 (und zurueck) wird bei "Pulse" ausgefuehrt. Die 
Laenge dieser beiden Phasen ist vom Pulsebreitenregister ab- 
haengig. Bei "Noise" koennen "zufaellige" Werte im Bereich 
von O0 bis 255 ausgelesen werden. Die Hauptanwendung dieses 
Register besteht, wie beim vorherigen Register auch, Echt- 
zeit-Effekte auszufuehren (was natuerlich im Normalfall nur 
von Maschinensprache aus moeglich ist), wobei die Parameter 
anderer Oszillatoren durch Werte, die durch Oszillator 3 er- 
zeugt wurden, geaendert werden. 


Viele Effekte, die auf von Oszillator 3 errechneten Daten 
aufbauen, benoetigen diese Stimme jedoch ueberhaupt nicht. 
Daher ist es moeglich, Stimme 3 abzuschalten, ohne jedoch 
die internen Vorgaenge zu beeinflussen. Das Signal von Ton- 
generator 3 erscheint so also nicht am Audio-Ausgang des 
SID-Chips. Jedoch bleiben Synchronisation und Ringmodulation 
davon unbetroffen, da diese kombinierten Signale davon unab- 
haengig sind, ob Oszillator 3 ein- oder ausgeschaltet ist. 
Das Ausschalten von Stimme 3 erfolgt durch Setzen des MSB in 
Register 24 (Adresse 54296). 


Die AD-Wandler 


Der SID verfuegt ausserdem ueber zwei AD-Wandler (POTX und 
POTY, Adressen 54297 und 54298), die es ermoeglichen, Poten- 
tiometerzustaende zu erkennen. Die in den Registern befind- 
lichen Werte - sie werden alle 512 Taktzyklen auf den neue- 
sten Wert gebracht - koennen im Bereich von 0 (niedrigster 
Widerstand) bis 255 (hoechster Widerstand) liegen. 


Beim Commodore 64 finden diese beiden Eingaenge des SID im 
Normalfall fuer die Paddles Verwendung, jedoch auch eine 
Verwendung als Temperaturfuehler oder Helligkeitsmesser wae- 
re nicht abwegig. 


Registeruebersicht (die Basisadresse des SID ist 54272): 
Register 0: LSB der Frequenz des Oszillators von Stimme 1 
Register 1: MSB der Frequenz des Oszillators von Stimme 1 


Register 2: niederwertigsten acht Bits des Pulsebreitenre- 
gisters (Stimme 1) fuer die Erzeugung von 
Rechtecksignalen 


Register 3: das LSN dieses Registers bildet die Bits 8 bis 
ll des Pulsebreitenregisters (Stimme 1), das 
MSN ist unbenutzt 


Register 4: Kontrollregister fuer Stimme |] 
Bit DO: GATE, Stimme 1 

wird dieses Bit gesetzt, so wird der 
durch die ADSR-Parameter gewaehlte Ab- 
lauf der Huellkurve begonnen. Innerhalb 
der durch ATTACK festgelegten Zeitspanne 
steigt die Lautstaerke bis auf den Maxi- 
malwert (durch LSN in Register 24 fest- 
gelegt), um dann die RELEASE-Phase zu 
beginnen, in der die Lautstaerke auf den 
durch SUSTAIN festgelegten Pegel zu- 
rueckfaellt. Dieser wird so lange gehal- 
ten, bis das GATE-Bit wieder rueckge- 
setzt wird. Im gleichen Augenblick be- 
ginnt SID RELEASE und laesst dadurch den 
Ton bis auf Nullpegel zurueckfallen. 


78 


Register 


Register 


Register 


Register 


Register 


Register 


Register 


5: 


6: 


Bit 1: SYNC 
Eine Synchronisation von Stimme |] mit 
Stimme 3 erfolgt durch Setzen dieses 
Bits. 


Bit 2: RING MOD 
Eine Ringmodulation von Stimme |] mit 
Stimme 3 erfolgt durch Setzen dieses 
Bits. 


Bit 3: TEST 

Wird dieses Bit gesetzt, so wird Stimme 
l gesperrt und gleichzeitig ein Reset 
des Oszillators durchgefuehrt, wodurch 
eine eventuelle (durch Kombination von 
"Rausch" mit einer weiteren Wellenform) 
Blockade des Rauschgenerators aufgehoben 
vird. 


Bit 4: Auswahl der Dreieckswellenform 
(TRIANGLE), falls Bit gesetzt 


Bit 5: Auswahl der Saegezahnwellenform 
(SAWTOOTH), falls Bit gesetzt 


Bit 6: Auswahl der Wellenform PULSE, falls Bit 
gesetzt 


Bit 7: Auswahl der "Wellenform" NDOISE, falls 
Bit gesetzt 


ATTACK/DECAY 

Bits 4 bis 7 (ATTACK) geben die Dauer (von 2 
msec bis 8 sec) an, die SID benoetigt, bis die 
Maximallautstaerke vom Nullpegel aus erreicht 
werden soll. 

Bits O0 bis 3 (DECAY) definieren die Zeitspanne 
(von 6 msec bis 24 sec), in der die Lautstaerke 
vom Maximalwert (nach ATTACK) auf SUSTAIN zu- 
rueekgeht. 


SUSTAIN/RELEASE 

Bits 4 bis 7 (SUSTAIN): Lautstaerkepegel, auf 
den bei DECAY zurueckgegangen wird. Dieser 
Level wird gehalten, bis GATE rueckgesetzt 
wird. 

Bits 0O bis 3 (RELEASE): Zeitspanne, in der der 
Lautstaerkepegel von SUSTAIN wieder auf null 
zurueckgeht. Der Bereich erstreckt sich, wie 
bei DECAY auch, von 6 msec bis 24 sec. 


Diese sieben Register haben die gleiche Funk- 
tion, wie die ersten sieben Register auch, je- 
doch fuer Stimme 2. Ringmodulation und Synchro- 
nisation erfolgen mit Stimme ]. 


Diese sieben Register haben die gleiche Funk- 
tion, wie die ersten sieben Register auch, je- 
doch fuer Stimme 3. Ringmodulation und Synchro- 
nisation erfolgen mit Stimme 2. 


FILTER LO ; 
Die niedervwertigster drei Bits bilden Bit O bis 
Bit 2 der Filterfrequenz (fuer alle Tongenera- 
toren identisch). Vebrige Bits sind ungenutzt. 


79 


Register 22: FILTER HI 
Dieses Byte bildet zusammen mit Bits 0 bis 2 
von Register 21 die Filterfrequenz. Diese gibt 
die Eck- beziehungsweise Zentralfrequenz des 
Filters an. 


Register 23: das MSN gibt die Resonanz im Bereich von 0 bis 
15 an. Dadurch werden die Frequenzkomponenten 
im Bereich der fFilterfrequenz besonders hervor- 
gehoben. 
Bit O0: leitet Stimme ] ueber den Filter (falls 
Bit gesetzt) 
Bit l: leitet Stimme 2 ueber den Filter (falls 
Bit gesetzt) 
Bit 2: leitet Stimme 3 ueber den Filter (falls 
Bit gesetzt) 
Bit 3: leitet externes Signal ueber den Filter 

* (falls Bit gesetzt) 


Register 24: LSN: globale Maximallautstaerke von 0 (ausge- 
schaltet) bis 15 (hoechste Lautstaerke) 
Bit 4: LOWPASS des Filters einschalten 
Bit 5: BANDPASS des Filters einschalten 
Bit 6: HIGHPASS des Filters einschalten 
(Kombination ist, wie beschrieben, moeglich) 


Bit 7: schaltet Stimme 3 aus, falls Bit ge- 
setzt. Dadurch kann Stimme 3 zur reinen Daten- 
gewinnung durch Register 27 und 28 verwendet 
verden. 


Auf all diese Register (#0 bis #24) kann NUR SCHREIBEND zu- 
gegriffen werden. Ein Auslesen ist nicht moeglich, da immer 
der Wert null ausgelesen wird. 


Die folgenden vier Register dahingegen koennen nur - ausgele- 
sen werden, ein schreibender Zugriff hat keinerlei Ausvir- 
kungen: 


Register 25: POTX, digitaler Wert des ersten A/D-Wandlers 
Register 26: POTY, digitaler Wert des zweiten A/D-Wandlers 


Register 27: der Registerinhalt gibt den momentanen Zustand 
des Oszillators 3 an und dient meist zur Erzeu- 
gung von speziellen Effekten. 


Register 28: hiermit kann der Verlauf der Huellkurve von 
Stimme 3 verfolgt werden. Je nach Zustand kann 
hier ein Wert im Bereich von 0 (niedrigste 
Lautstaerke) bis 255 (hoechste Lautstaerke) 
ausgelesen werden. 


Um einen Ton der gleichschwebend temperierten Skala (zum 
Beispiel beim Klavier) zu erzeugen, hier noch ein kurzes 
Beispielprogramm: 


100 B = 54272 : K = 77 * 2 $ 21.25 / 715909 

110 IF PEEK (678) THEN K = 495 * 2 ? 20.25 / 2216809 

120 POKE B + 5, O : POKE B + 6, 240 : POKE B + 24, 15 

130 FOR I = 0 T0 94 : n = Int (2t (1 / 12) *K + .5) 

140 H = INT (N / 256) : POKE-B, N - 256 * H : POKE B + 1, H 
150 POKE B + 4, 17 : FOR J = 0 TO 99 : NEXT : POKEB +4, 0 
160 NEXT : POKEB+4,0 


Die Pinbelegung des SID (MOS 6581) 


Pin 


l 


2: 


13: 


CAPAA, CAP1B: Anschluss fuer Kondensator, der 
durch den Filter benoetigt wird. Die Kapazitaet 
des angeschlossenen Kondensators betraegt beim 
Commodore 64 2200 pF 

CAPZA, CAP2B: Kondensatoranschluss fuer Filter; 
siehe Pin 1 und 2 

RES/, setzt SID in Grundzustand, alle internen 
Register werden auf null gesetzt 

PH2, Systemtaktfrequenz fuer Buskontrolle 

R/W, Schreib/Leseleitung des Prozessors 

CS/, Chip-Select, steuert Zugriff auf Register 
des SID 6581 

AO bis A4, Steuerleitungen zur Auswahl der 
Register des SID, die drei letzten Register 
sind unbenutzt und haben keine Bedeutung 

GND, Masseleitung 

DO bis D7, Datenbus zum Transfer von Daten vom 
und zum Prozessor 

Analogeingaenge (POTY, POTX) fuer Paddles 

VCC, Versorgungsspannung (+5 Volt) 

EXT IN, Eingang fuer externes Audio-Signal, das 
durch den Filter des SID geleitet werden soll 
AUDIO OUT, Ausgang aller im SID erzeugten 
Signale sowie EXT IN 

VDD, Versorgungsspannung (+12 Volt) 


PIN CONFIGURATIOH 
CAFIR 1 u 28 „DE: 
CAPIE 2 ar AUGICG CUT 
CAPZA 2 ze EXT IHN 
CAPZE J 2s CC 
RE= Ss 4 FOT= 
PHE 12 ea POT 
Ru ae ee ee CT 
cs g us BSel oe 
ra 3 2 DS 
Ri a 1 
1 
1 
l 
1 


1021 Ba DER Ba 1 EN a Bu u BZ 
2 
& 


£ aM» 


DD 
nz 

[= 

| 

| 

| 


81 


DER SERIELLE BUS DES COMMODORE 64 


Der Commodore 64 verfuegt ueber einen seriellen Bus, an den 
mehrere Peripheriegeraete angeschlossen werden koennen. Die- 
ser uebertraegt, im Gegensatz zum IEEE-488-Bus der Geraete 
der CBM-Serie, die Daten seriell (aehnlich der RS-232- 
Schnittstelle) zwischen Computer und Peripheriegeraet. Die 
Bedienung des Ports von Maschinensprache aus erfolgt aber 
ueber Routinen, die von der Funktion her identisch mit denen 
der CBMs sind. Diese Routinen lassen sind in zwei Gruppen 
einteilen: Die erste Gruppe bedient die Peripheriegeraete 
ueber ein Filehandling. Es wird jedem Kanal eine fFilenummer 
zugeordnet (es koennen mehrere Files gleichzeitig geoeffnet 
- aber nicht aktiv - sein), ein Zugriff erfolgt dann unter 
Angabe einer Filenummer. Dieses Prinzip entspricht ziemlich 
genau den BASIC-Befehlen fuer das Arbeiten mit Files: OPEN, 
CLOSE, PRINT#, INPUT# und GET#. So ist es zum Beispiel durch 
Aendern der Geraetenummer auch moeglich, eine Ausgabe auf 
den Bildschirm anstelle einer Ausgabe auf den Drucker zu er- 
reichen. 


Die zweite Gruppe von Routinen erfordert ein wesentlich 
sorgfaeltigeres Arbeiten, da man direkt ueber den seriellen 
Bus arbeitet. Daher koennen ueber diese Routinen (normaler- 
veise) auch nur Geraetenummern im Bereich von 4 bis 15 ver- 
wendet werden. Ein Programm, das ueber diese Routinen zum 
Beispiel auf die Diskettenstation zugreift, kann nicht (vie 
beim Arbeiten ueber logische Files) durch Aendern der Gerae- 
tenummer fuer Recorder umgeschrieben werden. Auch kann zu 
einem Zeitpunkt nur ein Kanal geoeffnet sein, durch den auf 
den seriellen Bus zugegriffen wird. 


Hier nun die genaue Vorgehensweise, um einen Kanal fuer den 
seriellen Bus zu bedienen. Es werden die Kommandos mit den 
Bezeichnungen versehen, wie sie auch in der Sprungtabelle 
fuer die Systemroutinen (siehe dort) verwendet worden sind. 
Um ein Kommando auszufuehren, muss der entsprechende Eintrag 
in der Sprungtabelle durch "JSR" oder "JMP" aufgerufen wver- 
den. 


Der erste Befehl dient zur Festlegung, ob das Geraet am se- 
riellen Bus Daten SENDEN oder EMPFANGEN soll. Entsprechend 
ist das erste Kommando entweder "TALK" oder "LISTEN", der 
Accu muss beim Aufruf einer dieser Routinen die Geraetenum- 
mer enthalten. Die naechste Routine dient zur Ausgabe der 
Sekundaeradresse, die im Normalfall der Festlegung des AT- 
beitsmodus' des Geraets dient. Je nachdem, ob die erste Rou- 
tine "TALK" oder "LISTEN" war, wird als zweite Routine 
"TKSA" oder "SECOND" verwendet. Der Accu enthaelt hier die 
Sekundaeradresse, die die Bits O0 bis 3 belegt. Die Bits 4 
bis 7 dienen weiterhin der Festlegung, ob ein Kanal (inner- 
halb des Peripheriegeraets) geoeffnet, geschlossen oder auf 
einen geoeffneten Kanal zugegriffen werden soll. Beim 
Schliessen eines Kanals sind die Bits 5 bis 7 gesetzt, beim 
Zugriff auf einen geoeffneten Kanal sind die Bits 5 und 6 
gesetzt, beim Eroeffnen eines Kanals sind alle Bits des MSN 
gesetzt. Die Ausgabe der Sekundaeradresse beendet automa- 
tisch den Kontrollmodus. 


Die Ausgabe eines Filenamens kann nach der Neuanmeldung ei- 
nes Kanals erfolgen, ist jedoch nicht unbedingt erforder- 
lich. Jedes Byte des Filenamens wird dann ueber "CIOUT" 
(Zeichencode im Accu) zeichenveise ausgegeben. Ist die Aus- 
gabe beendet, so muss die Routine "UNLSN" aufgerufen werden, 
da die Uebertragung des Filenamens schliesslich abgeschlos- 
sen ist. Auf diesen Kanal kann nun unter Angabe der gleichen 


82 


Sekundaeradresse wieder zugegriffen werden, was besonders 
beim Arbeiten mit Diskette wichtig ist. Auch die Ausgabe ei- 
nes CLOSE-Kommandos auf ein Peripheriegeraets hat - wie das 
BOPEN-Kommando auch - ueber "LISTEN", "SECOND" und "UNLSN" zu 
erfolgen. 


Wurde das Geraet durch gesetztes Bit 5 und Bit 6 in der Se- 
kundaeradresse angesprochen, so koennen nun durch "ACPTR" 
und "CIOUT" Daten empfangen und gesendet werden. Die Ueber- 
gabe der Parameter erfolgt jeweils ueber den Accu. Sind alle 
Daten uebertragen worden (beim Empfang durch die EOI-Kenn- 
zeichnung zu erkennen, jedoch nicht unbedingt bei Geraeten, 
die nicht von Commodore stammen), wird auch hier der Ab- 
schluss des Zugriffs durch "UNLSN" oder "UNTLK" (je nachdem) 
dem Peripheriegeraet mitgeteilt. 


Als Beispiel soll hier das Einlesen des Disketteninhaltsver- 
zeichnisses dienen, das beim Commodore 64 normalerweise 
ueber 'LOAD "$", 8' und 'LIST' ausgegeben werden muss. Beim 
folgenden Beispielprogramm wird nun aber nicht mehr das Pro- 
gramm, dass sich im Arbeitsspeicher befindet, weberschrie- 
ben, da das Inhaltsverzeichnis bei Aufruf der Routine direkt 
ausgegeben wird. Zum besseren Verstaendnis sollte der Aufbau 
von BASIC-Programmen (Ablage im Arbeitsspeicher) bekannt 
sein. 


LDA #0 

STA STATUS ;Statusvariable 'ST' loeschen 

LDA #8 sGeraetenummer fuer Diskettenstation 

JSR LISTEN ; LISTEN auf Bus ausgeben 

LDA #%11110000 ;sSekundaeradresse fuer OPEN Kanal OD 

JSR SECOND sKanal in Diskettenstation eintragen 

LDA #"$ ;sZeichen fuer Filenamen 

JSR CIOUT ;Filenamen auf Bus ausgeben 

JSR UNLSN sUNLISTEN auf Bus ausgeben 

LDA #8 sGeraetenummer fuer Diskettenstation 

JSR TALK ;TALK auf Bus ausgeben 

LDA #%01100000 ;Zugriff auf Kanal O der Floppy 

JSR TKSA ;Sekunaderadresse nach TALK ausgeben 

LDX #5 ;‚Zaehlwert fuer Schleife 

.BY 44 ;Code fuer BIT-Befehl 
START LDX #3 ;Zaehlwert fuer Schleife 
LOOP JSR GETBYT ;sZeichen holen, Status pruefen 

DEX 

BNE LOOP ;Schleife ausfuehren 

TAX ;Filelaenge (LSB) in XR uebertragen 

JSR 43735 ;sCRLF auf Bildschirm ausgeben 

JSR GETBYT ;MSB der Anzahl an Bloecken holen 

JSR 48589 ;Ausgabe der Anzahl an Bloecken 
LOOP2Z JSR GETBYT ;Zeichen holen, Status pruefen 

TAX ;Statusflags setzen 

BEQ START ;Nullcode? Zeilenende erkannt 

JSR CHROUT ;Ausgabe Zeichen auf den Bildschirm 

BNE LOOP2 ;Unbedingter Sprung 
GETBYT JSR ACPTR ;Zeichen von seriellem Bus holen 

LDY STATUS ;Statusvariable 'ST' pruefen 

BNE STOP ;Statusbit im Status gesetzt? 

RTS ;Nein: Rueckkehr zum Hauptprogramm 
STOP PLA ;Ruecksprungadresse vom Stack holen 

PLA 

JSR UNTLK ;Zugriff auf Kanal beenden 

LDA #8 sGeraetenummer fuer Diskettenstation 

JSR LISTEN ;LISTEN auf Bus ausgeben 

LDA #%11100000 ;Sekundaeradresse fuer CLOSE Kanal O0 

JSR SECOND ;Kanaleintrag loeschen 

JMP UNLSN ;sUNLISTEN auf Bus ausgeben 


84 


Soll dieses Programm ab der Adresse 828 abgelegt werden, so 
kann dies durch folgendes Programm geschehen (da das Pro- 
gramm dann im Bereich des Cassettenpuffers liegt, wird es 
natuerlich durch Recorderoperationen ueberschrieben): 


100 FOR I = 828 TO 917 : READ A : POKE I, A : NEXT 

110 DATA 169, , 133, 144, 169, 8, 32, 177, 255, 169, 240, 32 
120 DATA 147, 255, 169, 36, 32, 168, 255, 32, 174, 255, 169 
130 DATA 8, 32, 180, 255, 169, 96, 32, 150, 255, 162, 5, 44 
140 DATA 162, 3, 32, 124, 3, 202, 208, 250, 170, 32, 215 

150 DATA 170, 32, 124, 3, 32, 205, 189, 32, 124, 3, 170, 240 
160 DATA 232, 32, 210, 255, 208, 245, 32, 165, 255, 164, 144 
170 DATA 208, 1, 96, 104, 104, 32, 171, 255, 169, 8, 32, 177 
180 DATA 255, 169, 224, 32, 147, 255, 76, 174, 255 


Durch Anhaengen der Programmzeile ... 

190 POKE 874, 202 : POKE 879, 221 

kann das Programm auf dem WVIC-20 betrieben werden (siehe 
Adressumrechnung fuer VIC-20), da bei diesem das Arbeiten 


mit dem seriellen Bus in der gleichen Weise erfolgt, wie bei 
Commodore 64 auch. 


85 


DATENTRANSFER UEBER DIE RS-232-SCHNITTSTELLE 


Im Betriebssystem des Commodore 64 ist die Geraetenummer 
zwei der Bedienung der RS-232-Schnittstelle vorbehalten. 
Dies ist die Bezeichnung fuer einen Standard der seriellen 
Datenuebertragung und ist aehnlich der europaeischen V.24- 
Norm. Bei der seriellen Uebertragung wird nicht, wie dies 
zum Beispiel beim IEEE-488-Bus der Fall ist, ein Byte auf 
einmal, sondern Bit fuer Bit jede Informationseinheit ge- 
trennt uebergeben. Daraus resultiert natuerlich eine langsa- 
mere Vebertragungsrate als bei paralleler Uebertragung, da- 
fuer werden aber wesentlich weniger Datenleitungen benoe- 
tigt. Ein Anwendungsfall fuer eine serielle Uebertragung 
vaere zum Beispiel der Datenaustausch ueber Telefon. 


Zu den bereits im Commodore 64 enthaltenen Routinen fuer die 
Bedienung der RS-232-Schnittstelle wird nur noch ein Steck- 
modul benoetigt, das auf den Userport gesteckt wird und die 
Schnittstelle selbst darstellt, die dann vom Betriebssystem 
bedient wird. Nun ist es Ihnen mit dem Commodore 64 zum Bei- 
spiel auch moeglich, Peripheriegeraete mit RS-232-Schnitt- 
stelle zu verwenden. 


Wird beim Commodore 64 ein File mit der Geraetenummer zwei 
eroeffnet, so werden automatisch zwei Pufferbereiche (first 
in, first out) einer Laenge von je einer Page festgelegt, 
die fuer den Empfang und fuer das Senden von Daten verwendet 
werden. Dieser durch den OPEN-Befehl reservierte Bereich von 
512 Bytes wird am Ende des BASIC-Arbeitsspeichers angelegt. 
Nach Anlegen des RS-232-Pufferbereichs wird zusaetzlich ein 
"CLR" durchgefuehrt, so dass das Oeffnen eines RS-232-Kanals 
zu Beginn eines Programms durchgefuehrt werden sollte. Es 
kann immer nur ein RS-232-Kanal auf einmal geoeffnet sein, 
da durch ein zweites OPEN mit der Geraetenummer zwei die 
Pointer in die Puffer zurueckgesetzt werden und so bereits 
empfangene Daten oder noch nicht gesendete Daten verloren 
gehen. Auch das Schliessen eines RS-232-Kanals, das auch 
gleichzeitig die 512 Bytes wieder freigibt, beinhaltet ein 
"CLR" 5 


Achtung! Ist zum Zeitpunkt des Deffnens des RS-232-Kanals 
das Programm (ohne Variablen) so lang, dass keine 512 Bytes 
mehr frei sind, so wird wohl, ohne dass ein Fehler gemeldet 
werden wird, eine Zerstoerung des Programms die Folge sein. 


Saemtliche BASIC-Befehle zur Filebehandlung koennen auch bei 
Benutzung der RS-232-Schnittstelle Verwendung finden. Das 
gleichzeitige Empfangen und Senden von Daten ist, sofern 
spezifiziert, moeglich. Ansonsten geschieht dies nacheinan- 
der. 


Die Parameter zur Uebertragung werden durch den Filenamen 
(erstes Byte (Kontrollregister) und zweites Byte (Kommando- 
register)) festgelegt. Das dritte und vierte Byte werden nur 
dann benoetigt, falls eine durch den Benutzer festlegbare 
Vebertragungsrate spezifiziert werden soll. Wird kein File- 
name angegeben, so werden die Daten des letzten DPEN-Befehls 
verwendet. 


Das Kontrollregister bestimmt die Uebertragungsrate (Baud- 
Rate), die Laenge eines Datenworts (fuenf bis acht Bits) und 
die Anzahl an Stoppbits, die nach der Vebertragung der Da- 
tenbits (vor der Uebertragung des Startbits fuer die negati- 
ve Flanke) gesendet werden. 


Durch das Kommandoregister werden der Handshake-Modus und 
die Art der UVebertragung des Paritybits festgelegt. Ausser- 
dem wird angegeben, ob Vollduplex oder Halbduplex erwuenscht 
ist. 


Die einzelnen Bits des Kontrollregisters sind folgenderma- 
ssen organisiert: Bit O bis Bis 3 geben die Baud-Rate an, 
Bit 5 und 6 bestimmen die Wortlaenge und Bit 7 ist fuer die 
Anzahl an Stoppbits zustaendig. Bit 4 ist unbenutzt. Im fol- 
genden eine Uebersicht: 


Bit 3 21 0 dez Baud-Rate 

0000 0 User Rate siehe Beschreibung 
0007] l 50 Baud 

0071 0 2 75 Baud 

oo 171 3 110 Baud 

0100 4 134.5 Baud 

0 107]1 5 150 Baud 

01210 6 300 Baud 

oı 7171 7 600 Baud 

10 0 0 8 1200 Baud 

100 \]1 9 1800 Baud 

10710 10 2400 Baud 

10.1 ]1 11 3600 Baud nicht implementiert 
11000 12 4800 Baud nicht implementiert 
i: 2: 20:1 13 7200 Baud nicht implementiert 
112100 14 9600 Baud nicht implementiert 
r. 4. 10 >41 15 19200 Baud nicht implementiert 

Bit 6 5 dez Wortlaenge 

0 0 0 8 Bits 

0 1 32 7 Bits 

1 0 64 6 Bits 

1 1 96 5 Bits 


Bit 7 dez Stoppbits 


0 0 1 Stoppbit 
l 128 2 Stoppbits 


Durch das Kommandoregister wird durch Bit 0 der Handshake- 
Modus festgelegt, Bit 4 legt die Art des Duplex fest und Bit 
5 bis 7 sind fuer die Parity-Uebertragung notwendig. Die 
restlichen Bits (1, 2, 3) sind unbenutzt. Auch hier eine 
Uebersicht: 


Bit OD dez Handshake 


0 0 3-Line-Handshake 
l 1 X-Line-Handshake 


Bit 4 dez Duplex 


0 0 Vollduplex 
l 16 Halbduplex 
Bit 765 dez Parity-Uebertragung 


0 0 weder Pruefung, noch Uebertragung 
1 32 ungerade Parity 

1 96 gerade Parity 
1 
l 


.u.O0O 
-O-0 \ 


160 keine Pruefung, Vebertragung Bitvwert 1 
224 keine Pruefung, Vebertragung Bitwert 0 


87 


Hierzu ein praktisches Beispiel: 


Es soll ein RS-232-Kanal mit folgenden Parametern eroeffnet 
werden: 


VUebertragungrate: 110 Baud 


Wortlaenge: 8 Bits 

Anzahl Stoppbits: 2 Stoppbits 
Handshake: 3-Line-Interface 
Duplex: Halbduplex 
Parity: Ungerade Parity 


Das Eroeffnen koennte nun folgendermassen vorgenommen ver- 
den: 


OPEN 1, 2, O0, CHR$(128+0+3) + CHR$(32+16+0) 


Die weiteren zwei Zeichen werden nicht benoetigt, da keine 
eigene Uebertragungsgeschvwindigkeit spezifiziert wurde. 


Werden Wortlaengen unter acht Bits verwendet, so enthalten 
unbenutzte Bits den Wert null. 


Die Uebernahme von Zeichen sollte durch den GET#-Befehl er- 
folgen, da bei einem Fehler waehrend einer Uebernahme durch 
INPUT# (CTS- oder DSR-Missing) sich das System aufhaengt und 
nur durch RESTORE zurueckgeholt werden kann. Bei Empfang des 
Null-Zeichens CHR$(0) wird der Leerstring uebernomnmen. 


Bei der Vebergabe eines Wagenruecklaufs an einen Drucker 
wird nicht gevartet, bis der Drucker wieder bereit ist, Da- 
ten zu empfangen (falls der Drucker keine interne Pufferung 
besitzt). Daher sollte, falls der Drucker diese Moeglichkeit 
besitzt, X-Line-Interface verwendet werden, da hier die zu 
uebergebenden Zeichen solange in einem Puffer zwischenge- 
speichert werden, bis der Drucker durch die CTS-Leitung vie- 
der angibt, empfangsbereit zu sein. 


Beim Schliessen eines RS-232-Kanals wird jeglicher Daten- 
transfer abgebrochen und saemtliche Ausgaenge werden auf 
high gesetzt. 


Wird der RS-232-Status gelesen, so wird dieser automatisch 
geloescht, so dass bei mehreren Abfragen der Wert der Sta- 
tusvariablen einer anderen Variablen uwebergeben werden muss. 
Der RS-232-Status wird nur dann gelesen, falls die letzte 
Datentransferoperation die RS-232-Schnittstelle betraf. Die 
Bits des Statusregisters haben bei der Verwendung des 
RS-232-Kanals folgende Bedeutungen: 


Bit dez Bedeutung 


1 Parityfehler 
2 Framingfehler 
4 Empfangspuffer ueberlaufen 
8 Empfangspuffer leer (Zeichen ungueltig) 
16 CTS (Clear To Send) Signal fehlt 
32 unbenutzt 
64 DSR (Data Set Ready) Signal fehlt 
128 Abbruch erkannt 


SOAVFUuUNMO 


Ist Bit 2 gesetzt, so sollten mehr als 256 Zeichen im Emp- 
fangspuffer zwischengespeichert werden. Der Pufferzeiger 
wurde zurueckgesetzt. Die Zeichen sind verlorengegangen. 
Wird versucht ein Zeichen zu lesen, waehrend der Empfangs- 
puffer leer ist, so wird Bit 3 gesetzt. 


88 


Dıe Spezifizierung von eigenen Uebertragungsraten ist moeg- 
lich. Hierbei sollte jedoch beachtet werden, dass auf diese 
Weise nicht die vom Betriebssystem auferlegte obere Grenze 
von 2400 Baud ueberwunden werden kann, da durch die Taktfre- 
quenz hoehere Geschwindigkeiten nicht mehr verarbeitet ver- 
den koennen. 


Zum besseren Verstaendnis bei der Errechnung eigener Baud- 
Raten sollte das Betriebssystemlisting im Bereich von 62499 
bis 62540 herangezogen werden. Ausserdem wird die Kenntnis 
des Sprungvektors in Adresse 65409 (siehe Beschreibung der 
Systemroutinen) empfohlen. 


Ein Programmanfang, der einen RS-232-Kanal mit den im Bei- 
spiel spezifizierten Parametern eroeffnet, aber stattdessen 
eine Vebertragungsrate von 200 Baud (Variable B) definiert, 
koennte folgendermassen aussehen: 


100 F=14318180/14:IF PEEK(678) THEN F=17734472/18 
110 B=200:T=INT(F/B/2-99.5):H=INT(T/256):1L=T-256*H 
120 OPEN 1,2,0,CHR$(128+0+0)+CHR$( 32+16+0)+CHR$CL)+CHR$(H) 


Allerdings sollte beachtet werden, dass dies keinerlei Stan- 
dards entspricht. Das obige Programmsegment kann jedoch dann 
vervendet werden, wenn Sender und Empfaenger auf die Baud- 
Raten eingerichtet sind. 


Zum Abschluss noch eine Tabelle der beim RS-232-Handling 
verwendeten, RS-232-spezifischen Adressen in der Zeropage, 
Page 2 und im I/O-Bereich der NMI-CIA: 


167 : Zwischenspeicher fuer empfangenes Bit 

168 : Bitzaehler fuer den Empfang von Bytes 

169 : Flag fuer Empfang des Startbits 

170 : serielles Shift-Register fuer Empfang von Daten 
171 : Register zur Errechnung der Parity beim Empfang 
180 : Bitzaehler fuer die Ausgabe von Bytes 

181 : naechstes zu sendendes Bit (Bit 2) 

182 : serielles Shift-Register fuer Ausgabe von Daten 
189 : Register zur Bestimmung der Parity bei der Ausgabe 


247/248: Zeiger auf Beginn des Empfangspuffers; 
gueltig, falls Highbyte ungleich null 

249/250: Zeiger auf Beginn des Sendepuffers; 
gqueltig, falls Highbyte ungleich null 


659 : Kontrollregister (siehe Beschreibung) 
660 : Kommandoregister (siehe Beschreibung) 
661/662: Wert fuer Baud-Rate aus Tabelle 
663 : RS-232-Statusbyte 
664 : Wortlaenge (Berechnung bei OPEN) 
665/666: Wert fuer Timer beim Senden 
667 : Zeiger auf Ende des Empfangspuffers 
(letztes Zeichen + ]) 
668 : Zeiger auf Zeichen im RS-232-Empfangspuffer 
(naechstes Zeichen bei GET) 
669 : Zeiger auf zu uebertragendes Byte 
670 : Zeiger auf naechste freie Stelle im Sendepuffer 
673 : Flagregister fuer aktive NMIs (Datenuebertragung) 


Bit 0 ist beim Senden von Daten gesetzt; Bit 1 und 
Bit 4 werden beim Empfang benoetigt, Bit 1 fuer 
Timeout-TimerB und Bit 4 fuer die Erkennung des 
Startbits beim Uebergang vom high des Stoppbits zum 
low des Startbits. 


89 


Verwendete Adressen der NMI-CIA: 


56576 : Port A, siehe unten 
56577 : Port B, siehe unten 
56580/56581: TimerA, Baud-Rate fuer Ausgabe von Daten 
56582/56583: TimerB, Baud-Rate fuer Empfang von Daten 


56589 : ICR, Festsetzung der aktiven NMIs, 
Feststellung der NMI-Quelle 

56590 : CRA, Festlegung des TimerA Arbeitsmodus' 

56591 : CRB, Festlegung des TimerB Arbeitsmodus' 


Belegung des User-Ports in Verbindung mit den CIA-Ports: 


Pin 6526 Beschreibung Richtung 

A - GND : Protective Ground - 

B FLAG Sin : Received Data (fuer Startbit) IN 
C PBO Sin : Received Data, RS-232 IN IN 
D PBl RTS : Request To Send OUT 
E PB2 DTR : Data Terminal Ready DUT 
F PB3 RI : Ring Indicator IN 
H PB4 DCD : Data Carrier Detect IN 
J PB5 unbenutzt IN 
K PB6 CT5S : Clear To Send IN 
L PB7 DSR : Data Set Ready IN 
M PA2 Sout: Transmitted Data, RS-232 OUT DUT 
N - GND : Signal Ground _ 


DER 1/0 BAUSTEIN MOS 6526 (CIA) DES COMMODORE 64 


Zwei 1/0-Bausteine des Typs 6526 besitzt der Commodore 64. 
Durch sie wird der Kontakt vom Computer zur Aussenwelt ge- 
schaffen. Die Tastaturabfrage, die Erkennung von Signalen 
auf Cassette, die Kommunikation ueber den seriellen Bus oder 
die RS-232-Schnittstelle, all dies und noch einiges mehr ist 
erst durch diese beiden Bausteine moeglich, deren Funktionen 
hier dargelegt werden sollen. 


Zuerst eine allgemeine Beschreibung, die fuer beide CIAs 
(Complex Interface Adapter) gilt. Auf die Unterschiede zvi- 
schen den beiden Bausteinen, die nur in deren Verwendung 
beim Commodore 64 liegen, wird im Anschluss eingegangen. 


Eine kurze Uebersicht: Dieser Baustein verfuegt ueber 16 
einzeln programmierbare Portleitungen sovie ueber zugehoeri- 
ge Kontrolleitungen, die fuer Handshaking verwendet werden 
koennen, zwei kombinierbare 16-Bit-Timer und ein B-Bit- 
Shiftregister fuer serielle Datenuebertragungen. Ausserdem 
existiert eine interne 24-Stunden-Uhr mit programmierbarer 
Alarmzeit. 


Die Steuerung all dieser Moeglichkeiten erfolgt ueber sech- 
zehn Register, die verschiedene Funktionen erfuellen. Vier 
dieser Register dienen der Programmierung der 


PORTS DER CIA 


Die CIA besitzt zwei Ports zu je einer Breite von acht Bits. 
Jede Portleitung der beiden Ports (Port A und Port B ge- 
nannt) kann unabhaengig als Eingang oder Ausgang geschaltet 
werden. Dies geschieht ueber die Datenrichtungsregister der 
CIA. Entsprechend den beiden Ports existieren zwei Daten- 
richtungsregister mit den Bezeichnungen "DDRA" und "DDRB" 
(Data Direction Register). Jedes Bit eines Datenrichtungsre- 
gisters gehoert entsprechend zu einem Bit eines der beiden 
Register, in denen dann der Zustand der Portleitung geaen- 
dert oder geprueft werden kann. Diese beiden Register hei- 
ssen "PRA" und "PRB" (Peripheral Data Register). 


Um eine Portleitung als EINGANG zu kennzeichnen, muss das 
zugehoerige Bit im Datenrichtungsregister GELDOESCHT werden. 
Entsprechend ist das Bit im Datenrichtungsregister zu SET- 
ZEN, wenn die Portleitung als AUSGANG verwendet werden soll. 


Die Datenrichtungsregister befinden sich an den Adressen 2 
(DDRA) und 3 (DDRB) relativ zur Basisadresse des Bausteins. 
Die Ports nehmen die Adressen O (PRA) und 1 (PRB) ein. Die 
Nummern der Portleitungen (PAO bis PA7, PBO bis PB7) ent- 
sprechen den Nummern der Bits der zugehoerigen Steuerregi- 
ster. PB6 und PB7 werden auch im Zusammenhang mit den Timern 
verwendet. 


Die Vebergabe von Daten zwischen zwei CIAs (oder aehnlichen 
Bausteinen) kann unter Kontrolle der Leitungen PC und FLAG 
erfolgen. So wird PC fuer die Dauer eines Taktes auf Low-Pe- 
gel gelegt, wenn auf PRB lesend oder schreibend zugegriffen 
wurde. Dieses Signal kann verwendet verden, um zu zeigen, 
dass die Daten (die von anderer Stelle auf den Port B gege- 
ben wurden) vom Computer gelesen worden (DATA ACCEPTED) 
sind. Andererseits kann dadurch auch erkannt werden, dass 
neue Daten vorliegen und gelesen werden koennen (DATA 
VALID). Dies kann durch die FLAG-Leitung festgestellt wer- 
den. Sie erkennt negative Flanken (Wechsel von high nach 
low) und gibt diese Information in Form einer gesetzen Flag 


91 


in einem Register der CIA weiter. Ausserdem kann zusaetzlich 
ein Interrupt ausgeloest werden. Sollen also Daten zwischen 
zwei Computern durch deren CIAs ausgetauscht werden, so ge- 
nuegt es, die PC-Leitung der einen CIA mit der FLAG-Leitung 
der anderen CIA (und umgekehrt) zu verbinden (natuerlich zu- 
saetzlich zu Portleitungen von Port B). 


DER SERIELLE PORT 


Der Serielle Port besteht aus einem Shiftregister, das mit 
Daten einer Breite von acht Bits arbeitet. Dieses Shiftregi- 
ster kann sowohl als Eingang, als auch als Ausgang program- 
miert werden. Dies geschieht durch Bit 6 von CRA. Ist dieses 
Bit geloescht, so fungiert der serielle Port als Eingang, 
ansonsten als Ausgang (gleiche Spezifikation, wie bei den 
Datenrichtungsregistern auch). Als Leitungen fuer die Ueber- 
gabe von Daten durch den seriellen Port dienen die Pins SP 
und CNT. Dabei werden die Daten auf SP wuebertragen, die 
Steuerung erfolgt durch CNT. Ist das Shiftregister auf Ein- 
gang geschaltet, so wird im Falle einer positiven Flanke auf 
CNT der am Eingang SP befindliche Wert in das Shiftregister 
geschoben. Ist dies achtmal geschehen, so wird der Wert des 
Shiftregisters in das Serial Data Register (SDR) uebertra- 
gen. Gleichzeitig wird (sofern zugelassen) ein Interrupt ge- 
neriert, woraufhin dann die gelesenen Daten durch den Compu- 
ter verarbeitet werden koennen. Im Ausgabemodus wird die Ge- 
schwindigkeit, mit der die Daten aus dem Shiftregister auf 
den seriellen Port ausgegeben werden, durch Timer A spezifi- 
ziert. Dabei betraegt die Baudrate die halbe Underflow-Rate 
von Timer A. Die hoechste Uebertragungsrate waere demnach 
ein Viertel des Systemtakts, was jedoch in der Praxis kaum 
erreicht werden kann, da die Daten schliesslich vom Empfaen- 
ger auch noch verarbeitet werden muessen. Sind Daten ins SDR 
geschrieben worden, so beginnt die Uebertragung der Daten 
(sofern Timer A laeuft und sich im Continuous Mode befin- 
det). Am CNT-Pin erscheint nun die aus Timer A abgeleitete 
Frequenz, die Daten werden aus dem Shiftregister (auf SP) 
geschoben, waehrend eine positive Flanke auf CNT ausgegeben 
wird. Dabei wird das MSB des seriellen Ports zuerst heraus- 
geschoben (eingehende Daten sollten das gleiche Format auf- 
weisen, da sie ansonsten erst umgewandelt werden muessen). 
Sind alle acht Bits uebertragen worden, wird (ebenso wie 
beim Empfang von Daten) ein Interrupt ausgeloest, der dem 
Programm mitteilt, dass weitere Daten uwebertragen werden 
koennen. Dies geschieht nicht, wenn bereits vor der Ueber- 
tragung des achten Bits neue Daten ins SDR geschrieben wur- 
den. In diesem Fall wuerde die Uebertragung direkt fortge- 
setzt. 


DIE TIMER 


Jeder der beiden Timer der CIA besteht aus einem Vorspeicher 
(Latch) und Zaehler (Counter) mit einer Breite von je sech- 
zehn Bits. Wird in die zu einem Timer gehoerigen Register 
GESCHRIEBEN, so wird dieser Wert automatisch ins Latch 
uebertragen. Beim LESEN dagegen erscheint immer der momenta- 
ne Zaehlervert. Die beiden Timer koennen unabhaengig vonein- 
ander benutzt werden, es besteht jedoch auch die Moeglich- 
keit, sie miteinander zu verbinden. Weiterhin bestehen meh- 
rere verschiedene Modi, die es erlauben, lange Verzoege- 
Tungsschleifen zu programmieren oder zum Beispiel spezielle 
Wellenformen mit unterschiedlich langen Impulslaengen zu ge- 
nerieren. Das Lesen des Counters und Schreiben des Latch er- 
folgt fuer Timer A ueber die Register 4 (low) und 5 (high), 
Timer B wird ueber die Register 6 und 7 (ebenfalls low und 
high) programmiert. 


92 


Die Kontrolle des Arbeitsmodus' der beiden Timer erfolgt 
ueber ihnen zugeordnete (voneinander unabhaengige) Kontroll- 
register (CRA und CRB, Register 14 und 15), deren Bits  fol- 
gende Bedeutungen haben: 


Bit O0: START/STOP 


Durch das Loeschen dieses Bit kann ein Timer jederzeit ange- 
halten oder durch das Setzen dieses Bits gestartet werden. 


Bit 1: PB ON/OFF 


Sollen Signale unter Kontrolle eines Timers an einem Port 
erzeugt werden, so kann dies durch dieses Bit gesteuert ver- 
den. Bei jedem Timeout wird der zum Timer gehoerige Port 
(PB6 fuer Timer A, PB7 fuer Timer B) entsprechend den Anga- 
ben in Bit 2 beeinflusst (sofern Bit 1 gesetzt ist! Ist es 
geloescht, so hat der Timer keinerlei Einfluss auf die Port- 
leitung). Diese Funktion hat eine hoehere Prioritaet als die 
Funktionszuveisung von PB6 und PB7 im DDRB. Ist dieses Bit 
also gesetzt, so fungiert dieser Port ohne Ruecksicht auf 
den Wert im DDRB als Ausgang. 


Bit 2: TOGGLE/PULSE 


Dieses Bit gibt an, in welcher Weise die zum Timer gehoerige 
Portleitung beim Timeout des Timers arbeiten soll. Ist das 
Bit geloescht, so wird bei jedem Timeout auf der zugehoeri- 
gen Portleitung ein positives Signal der Laenge eines Takt- 
zyklus gegeben. Die zweite Moeglichkeit ist, durch diesen 
Port Rechtecksignale bestimmter Frequenz auszugeben. Ist 
dieses Bit naemlich gesetzt, so wird bei jedem Timer-Under- 
flow das Signal an diesem Port invertiert. Die Frequenz die- 
ses Signals entspricht dadurch (wie beim Arbeiten mit dem 
Seriellen Port auch) der halben Underflow-Rate des Timers. 
Beide Modi jedoch arbeiten nur dann, wenn Bit 1 auch gesetzt 
ist. 


Dieser Modus ist uebrigens identisch mit dem des "OUTPUT EN- 
ABLE" durch Setzen von Bit 7 im ACR der VIA 6522, wodurch 
ueber PB7 Rechtecksignale ausgegeben werden koennen, deren 
Frequenz durch Timer 1 festgelegt wurde. 


Bit 3: ONE-SHOT/CONTINUOUS 


Im One-Shot-Modus (Bit gesetzt) zaehlt der Counter vom ge- 
speicherten Wert bis auf den Wert '0' herunter, erzeugt ei- 
nen Interrupt, laedt den Timer neu mit dem im Latch befind- 
lichen Wert und stoppt dann. Im Continuous Mode stoppt der 
Timer nicht, sondern beginnt dann diese Prozedur von vorne. 


Bit 4: FORCE LOAD 


Wird in dieses Bit der Wert ']' geschrieben, so wird der 
Counter des Timers, unabhaengig davon, ob er gerade laeuft 
oder nicht, mit dem im Latch befindlichen Wert geladen. Beim 
Lesen ist dieses Bit immer geloescht. Das Schreiben einer 
'0' hat keinerlei Wirkung. 


Ein Counter wird ausserdem automatisch immer dann mit dem 
Wert des Latch geladen, falls ein Underflow auftritt oder 
(nur wenn der Timer momentan gestoppt ist) wenn in das High- 
byte des Timers geschrieben wird. Werden also neue Latchver- 
te gespeichert, so braucht kein FORCE LOAD zu erfolgen, wenn 
diese Werte in der Reihenfolge low/high gespeichert werden. 


93 


Die folgenden Bits sind fuer CRA und CRB unterschiedlich be- 
legt und bieten fuer die verschiedenen Timer verschiedene 
Moeglichkeiten, welches die Quelle fuer das Herabzaehlen des 
Timers sein soll. 


CRA, Bit 5: IN MODE 


Ist dieses Bit geloescht, so wird Timer A mit der Frequenz 
des Systemtakts herabgezaehlt. Bei gesetztem Bit 5 wird Tim- 
er A bei jedem positiven Impuls auf CNT um den Wert ']' ver- 
mindert. 


CRB, Bit 5 und Bit 6: IN MODE 


Fuer Timer B existieren zu den beiden Modi von Timer A (die 
fuer Timer B bei geloeschtem Bit 6 Gueltigkeit haben) noch 
zwei weitere Taktquellen: Bei der ersten (Bit 6 gesetzt, Bit 
5 geloescht) wird Timer B bei jedem Underflow von Timer A 
herabgezaehlt. Dadurch ist es moeglich, beide Timer zu einem 
Timer mit einer Breite von 32 Bits zu kombinieren. Als wvei- 
terer Arbeitsmodus bietet sich die Moeglichkeit, Timer B nur 
dann die Underflow-Impulse von Timer A zaehlen zu lassen, 
venn waehrenddessen CNT auf High-Pegel liegt. 


TIME OF DAY CLOCK 


Die CIA verfuegt ueber eine 24-Stunden-Echtzeituhr mit einer 
Aufloesung von einer Zehntelsekunde. Zusaetzlich besteht die 
Moeglichkeit, eine Alarmzeit festzulegen. Ist diese Alarm- 
zeit durch die Uhr erreicht worden, so wird ein Interrupt 
ausgeloest. Die Uhr ist in vier Register aufgeteilt: ein 
Stundenregister, dessen MSB die Flag fuer AM/PM darstellt, 
ein Minuten- und Sekundenregister sovie ein weiteres Regis- 
ter fuer die Zehntelsekunden. Die Zahlendarstellung in all 
diesen Registern erfolgt im gepackten BCD-Format, wodurch 
eine Umwandlung der Daten in den Registern durch Maschinen- 
programmen vereinfacht (und beschleunigt) wird. 


Die Uhr wird ueber die Netzfrequenz getaktet, wodurch eine 
recht hohe Genauigkeit gewaehrleistet ist. Es werden Netz- 
frequenzen von 50 und 60 Hertz (einstellbar) verarbeitet. 
Die Einstellung erfolgt durch Bit 7 des CRA (geloescht = 60 
Hz, gesetzt = 50 Hz). 


Die Alarmzeit wird durch die gleichen Register wie die nor- 
male Zeit auch festgesetzt. Die Unterscheidung erfolgt durch 
Bit 7 des CRB. Ist es gesetzt, so werden die in die Register 
8 bis 11 (Zehntelsekunden bis Stunden) geschriebenen Daten 
als Alarmzeit aufgefasst. Ist es geloescht, so kann die nor- 
male Uhrzeit festgelegt werden. Das Lesen der Register , gibt 
immer die Uhrzeit an. Die Alarmzeit kann daher nicht gelesen 
verden. 


Soll die Uhrzeit gelesen werden, so werden beim Lesen des 
Stundenregisters automatisch saemtliche Register fuer die 
Uhrzeit in ein Latch uebertragen, sodass waehrend des Lesens 
keinerlei Vebertrag auftreten kann. Es kann nun also die 
Uhrzeit zum Zeitpunkt, zu dem das Stundenregister gelesen 
wurde, verarbeitet werden - es treten keinerlei Uebertrags- 
probleme mehr auf. Die Uhr "steht" nun scheinbar, laeuft in- 
tern jedoch weiter. Ist zum Abschluss das Register fuer die 
Zehntelsekunden gelesen worden, so erscheint die Uhrzeit nun 
wieder direkt in den Registern, es erfolgt keinerlei Zwi- 
schenspeicherung mehr. Natuerlich ist es moeglich, einzelne 
Register zu lesen, ohne dass eine Zwischenspeicherung er- 
folgt. Schliesslich tritt beim Lesen von einzelnen Registern 


94 


nicht mehr das Problem des Uebertrags auf. Soll jedoch das 
Stundenregister alleine gelesen werden, so muss anschlie- 
ssend das Register fuer Zehntelsekunden gelesen werden, um 
das Latchen wieder aufzuheben. 


Aehnlich erfolgt dies beim Setzen der Uhrzeit. Sobald in das 
Stundenregister geschrieben wurde, wird die Uhr sofort ge- 
stoppt. Sie laeuft erst dann wieder an, wenn das Register 
fuer Zehntelsekunden gesetzt wurde. Dadurch wird erreicht, 
dass die Uhr auch wirklich erst zu dem Zeitpunkt anfaengt zu 
laufen, der durch die neuen Werte festgelegt wurde. 


INTERRUPT HANDLING 


Bei einer CIA existieren fuenf Moeglichkeiten des Inter- 
rupts, die einzeln kontrolliert werden koennen. Dazu dient 
das Register 13. Durch dieses wird festgelegt, ob durch eine 
Interruptquelle auch die Interruptleitung des Prozessors auf 
low gelegt werden soll. Es ist also moeglich, jeden einzel- 
nen Interrupt getrennt zu sperren oder freizugeben. Ausser- 
dem kann, unabhaengig davon, ob der Interrupt zugelassen ist 
oder nicht, durch Lesen von Register 13 festgestellt werden, 
ob das geforderte Ereignis fuer einen Interrupt aufgetreten 
ist. Es kann jedoch nicht der Zustand des Interrupt Enable 
Registers festgestellt werden. Daher kann es notwendig sein, 
ein weiteres Register im RAM zu verwenden, um aktive Inter- 
rupts zu merken (dies wird beim RS-232-Handling gemacht). 


Hier die Belegung des Registers: 


Bit O0: Underflow von TIMER A 

Bit 1: Underflow von TIMER B 

Bit. 2: TIME OF DAY CLOCK = ALARM 

Bit 3: Shiftregister voll/leer (je nach Modus) 
Bit 4: negative Flanke auf FLAG 


Beim Lesen von Register 13 sind im gelesenen Wert nun saenmt- 
liche Bits gesetzt, fuer die die Bedingung eines Interrupts 
erfuellt ist (Bit 5 bis Bit 7 sind unbenutzt). Beim Lesen 
dieses Registers werden ausserdem saemtliche Bits rueckge- 
setzt, sodass der gelesene Wert bei mehrfacher Verwendung 
zwischengespeichert werden muss. 


Soll ein Interrupt (oder mehrere) GESPERRT werden, so muss 
ein Wert in Register 13 geschrieben werden, in dem saemtli- 
che Bits gesetzt sind, deren entsprechende Interruptquellen 
gesperrt werden sollen. Soll ein Interrupt FREIGEGEBEN wver- 
den, so muss zusaetzlich Bit 7 in diesem Wert gesetzt sein. 
Bit 7 fungiert also als Flag dafuer, ob ein Interrupt ge- 
sperrt oder freigegeben werden soll. 


Registeruebersicht: 


Register 0: PRA (Port Register A) 
Dient zur Feststellung der Zustaende von Port A 
(Eingang) und zum Aendern derselben (Ausgang). 


Register 1: PRB (Port Register B) 
Dient zur Feststellung der Zustaende von Port B 
(Eingang) und zum Aendern derselben (Ausgang). 


Register 2: DDRA (Data Direction Register A) 
Festlegung der einzelnen Portleitungen von Port 
A als Eingang (Bit geloescht) oder Ausgang (Bit 
gesetzt). 


95 


Register 3: 


Register 4 


Register 5: 


Register 6: 


Register 7: 


Register 8: 


Register 9: 


Register 10: 


DDRB (Data Direction Register B) 

Festlegung der einzelnen Portleitungen von Port 
B als Eingang (Bit geloescht) oder Ausgang (Bit 
gesetzt). 


TA LO (Timer A Low Order Byte) 

Beim LESEN dieses Registers wird der momentane 
Wert des Counters (LSB) von Timer A zurueckge- 
geben. 

Ein SCHREIBENder Zugriff setzt das LSB des 
Latch von Timer A fest. 


TA HI (Timer A High Order Byte) 

Beim LESEN dieses Registers wird der momentane 
Wert des Counters (MSB) von Timer A zurueckge- 
geben. 

Ein SCHREIBENDER Zugriff setzt das MSB des 
Latch von Timer A fest. Ausserdem wird, sofern 
Timer A gestoppt ist, der Wert des Latch in den 
Counter uebertragen. 


TB LO (Timer B Low Order Byte) 
Die Funktion dieses Registers entspricht der 
des Registers 4, jedoch fuer Timer B. 


TB HI (Timer B High Order Byte) 
Die Funktion dieses Registers entspricht der 
des Registers 5, jedoch fuer Timer B. 


TOD 10THS (10ths of Seconds Register) 

LESEN: Zehntelsekunden der internen Uhr im BCD- 
Format, gleichzeitiges Aufheben einer durch das 
Lesen des Stundenregisters hervorgerufenen Zvi- 
schenspeicherung. 

SCREIBEN: Festlegung der Zehntelsekunden der 
internen Uhr sowie gleichzeitiges Starten der 
Uhr (falls MSB von CRB gesetzt), ansonsten 
Festsetzung der Zehntelsekunden der Alarmzeit. 


Bit 4 bis Bit 7 sind unbenutzt. 


TOD SEC (Seconds Register) 

LESEN: Sekunden der internen Uhr im BCD Format. 
SCREIBEN: Festlegung der Sekunden der internen 
Uhr (falls MSB von CRB gesetzt), ansonsten 
Festsetzung der Sekunden der Alarmzeit. 


Bit O bis Bit 3 enthalten die Einerstelle, Bit 
4 bis 6 die Zehnerstelle der Sekunden. Bit 7 
ist unbenutzt. 


TOD MIN (Minutes Register) 


Funktion und Belegung entsprechend Register 9, 
jedoch fuer die Minuten. 


96 


Register ll: 


Register 12: 


Register 13: 


Register 14: 


TOD HR (Hours + AM/PM Register) 
Bit O bis Bit 3: Einerstelle der Stunden 


Bit 4 : Zehnerstelle der Stunden 
Bit 5 und Bit 6: unbenutzt 
Bit 7 : AM (=0) und PM (=1) Flag 


LESEN: Stunden und AM/PM-Flag der internen Uhr, 
gleichzeitig wird die Uhrzeit in ein internes 
Latch uebertragen, damit es nicht zu Ueberlauf- 
problemen kommt. Die Zwischenspeicherung wird 
durch Lesen von Register 8 aufgehoben. 
SCREIBEN: Festlegung der Stunden (und AM/PM) 
der internen Uhr sovie gleichzeitiges Stoppen 
der Uhr (falls MSB von CRB gesetzt), ansonsten 
Festsetzung der Stunden (und AM/PM) der Alarm- 
zeit. 


SDR (Serial Data Register) 

Dieses Register dient dazu, die Daten fuer den 
Seriellen Port festzulegen (WRITE) oder gelese- 
ne Daten zu uebernehmen (READ). 


ICR (Interrupt Control Register) 

LESEN (Interrupt DATA): Feststellung, ob Inter- 
Tupts aufgetreten sind (Bit gesetzt). Bit 7 ist 
gesetzt, wenn mindestens ein Interrupt freige- 
geben und die Bedingung fuer diesen Interrupt 
gegeben ist. Saemtliche Bits werden geloescht, 
wenn dieses Register gelesen wurde. 

SCHREIBEN (Interrupt MASK): Jegliche Inter- 
rupts, deren zugehoerige Bits gesetzt sind, 
verden, falls Bit 7 des geschriebenen Wertes 
gleich eins ist (MASK Bit wird gesetzt), frei- 
gegeben. Ist Bit 7 geloescht, so wird dieser 
Interrupt gesperrt (MASK Bit wird geloescht). 
Die Interrupts, deren korrespondierende Bits im 
geschriebenen Wert geloescht sind, bleiben un- 
beeinflusst. 


Bit O0: Underflow von Timer A 

Bit 1: Underflow von Timer B 

Bit 2: interne Uhr hat Alarmzeit erreicht 

Bit 3: Shiftregister voll/leer (Input/Output) 
Bit 4: negative Flanke auf FLAG 

Bit 5 und Bit 6 sind unbenutzt. 


CRA (Control Register A) 

Bit O: START 
Ist dieses Bit gesetzt, so laeuft Timer 
A momentan, ansonsten ist er gestoppt. 
Durch Setzen dieses Bits kann Timer A 
gestartet werden, beim Loeschen wird 
Timer A sofort angehalten. 

Bit 1: PB ON 
Ist dieses Bit gesetzt, so wird ein Un- 
derflow von Timer A auf die im naechsten 
Bit gekennzeichnete Weise auf PB6 sicht- 
bar gemacht. Ist Bit 1 geloescht, so hat 
Timer A keinerlei Einfluss auf PB6. 

Bit 2: OUT MODE 
Bei gesetztem Bit (TOGGLE) wird bei je- 
dem Underflow von Timer A das Signal auf 
PB6 invertiert. Ist es geloescht 
(PULSE), so wird bei einem Underflow ein 
positiver Impuls fuer die Dauer eines 
Systemtakts ausgegeben. 


97 


Bit 3: RUN MODE 
Durch Setzen dieses Bits wird bevirkt, 
dass Timer A, nachdem er vom gelatchten 
Wert auf null zurueckgezaehlt hat, an- 
haelt (Counter wird neu geladen). Ist es 
geloescht, so wird fortlaufend vom 
Startwert auf null zurueckgezaehlt. 

Bit 4: LOAD 
Durch Setzen dieses Bit wird ein Laden 
des Counters mit dem im Latch gespei- 
cherten Wert erzwungen. Beim Lesen ist 
dieses Bit jedoch immer geloescht. 

Bit 5: IN MODE 
Timer A zaehlt die Impulse des System- 
takts, wenn dieses Bit geloescht ist, 
bei gesetztem Bit zaehlt Timer A die 
positiven Impulse auf CNT. 

Bit 6: SP MODE 
Dieses Bit schaltet den Seriellen Port 
auf Eingang (=0) oder Ausgang (=1]). 

Bit 7: TOD IN 
Die Einstellung der zu verarbeitenden 
Netzfrequenz fuer die interne Uhr er- 
folgt ueber dieses Bit. 50 Hz werden 
verarbeitet, wenn dieses Bit gesetzt 
ist, ansonsten werden 60 Hz am TOD-Pin 
erwartet. 


Register 15: CRB (Control Register B) 
Die Bits O bis 4 entsprechen in der Funktion 
denen des Registers CRA, jedoch fuer Timer B 
und PB7. 
Bit 5 und Bit 6: IN MODE 
Ist Bit 6 geloescht, so entspricht der Zaehlmo- 
dus von Timer B der in Bit 5 festgelegten Weise 
(entsprechend der Bedeutung von IN MODE in 
CRA). Ist Bit 6 gesetzt, so zaehlt Timer B die 
Underflows von Timer A (Bit 5 geloescht) oder 
nur dann die Underflows von Timer A, wenn CNT 
auf high liegt (Bit 5 gesetzt). 
Bit 7: ALARM 
Das Setzen dieses Bits bewirkt, dass beim 
schreibenden Zugriff auf die Register 8 bis 11 
nicht die normale Uhrzeit (wie dies der Fall 
ist, wenn dieses Bit geloescht ist) gesetzt 
wird, sondern die Alarmzeit, die jedoch nicht 
ausgelesen werden kann. 


DIE VERWENDUNG DER CIAs IM COMMODORE 64 


Die Register der beiden CIAs belegen im Commodore 64 den Be- 
Teich von 56320 bis 56335 (CIA #1) sowie den Bereich von 
56576 bis 56591 (CIA #2). Einer der Hauptunterschiede zwi- 
schen den beiden CIAs besteht darin, dass die Interrupt-Lei- 
tung der CIA #1 mit der IRQ-Leitung des Prozessors verbunden 
ist. Ist also eine der Interruptquellen der CIA freigegeben, 
so kann sie beim Prozessor einen IRQ ausloesen. Dahingegen 
ist die zweite CIA mit der NMI-Leitung verbunden. Sie wird 
zum Ausloesen der Interrupts fuer das RS-232-Handling ver- 
vendet, da dieses (aus Gesehwindigkeitsgruenden) "parallel" 
zu allen anderen Aktivitaeten des Prozessors abgewickelt 
werden muss und daher ‚die hoechste Prioritaet bekommt. Daher 
verden die beiden CIAs auch nach diesen Verbindungen zur CPU 
bezeichnet: IRQ-CIA fuer CIA #1, NMI-CIA fuer CIA #2. Die 
Register sind in. der normalen Reihenfolge von O bis 15 ange- 
ordnet. 


98 


Hier die genaue Verwendung der einzelnen Moeglichkeiten der 
beiden CIAs im Commodore 64: 


IRQ-CIA (CIA #1): 


Die beiden Ports dienen der Abfrage der Joysticks, Tastatur 
und der Auswahl der Paddles: 


Port A: Jedes der acht Bits kann eine Reihe der Tastatur zur 
Dekodierung anwaehlen, wenn das entsprechende Bit geloescht 
ist. 

Bit 0 bis Bit 4 dienen ausserdem der Abfrage von Controlport 
2, Bit 6 und Bit 7 der Auswahl des Paddlepaares (siehe Er- 
klaerung von Paddle und Joystick). 


Port B: Dieser Port dient der Spaltenrueckmeldung der ausge- 
waehlten Tastaturreihe fuer die Tastaturdekodierung. Eine 
Taste der ausgewaehlten Reihe ist gedrueckt, wenn das ent- 
sprechende Bit geloescht ist. Bits O0 bis 4 werden auch hier 
zur Joystickabfrage (Controlport 1) verwendet. 


Timer A wird zur Erzeugung des "normalen" IRQs alle 60stel 
Sekunden benutzt. Ist ein Underflow aufgetreten, so wird un-,_ 
ter anderem die Tastatur abgefragt, die softwaremaessig rea- 
lisierte Uhr (nicht die CIA-Uhr!) weitergestellt und anderes 
erledigt. Ausserdem wird dieser Timer fuer das Lesen von 
Cassette benoetigt. 


Timer B wird nur bei Cassettenoperationen (beim Schreiben 
zur Festlegung der Impulslaengen, beim Lesen zur Feststel- 
lung der Impulsabstaende) sowie bei der Benutzung des seri- 
ellen Bus' (fuer Wartezeiten) verwendet und sollte daher 
fuer eigene Programme problemlos verwendet werden koennen. 


Die eingebaute Echtzeituhr wird (zusammen mit Timer A) vom 
Betriebssystem nur gelesen, um daraus Zufallszahlen bei 
"RND(O)" zu generieren. Dies sollte jedoch andere Progranm- 
me, die die Echtzeituhr benutzen, nicht beeinflussen. 


Der Serielle Port ist, wie das Pin CNT auch, vollkommen un- 
benutzt und ist fuer eigene Anwendungen an den User-Port 
herausgefuehrt. 


Der FLAG-Eingang wird zum Lesen von Cassette und als 
SRQ-Eingang (Service .ReQuest) am seriellen Bus verwendet. 


NMI-CIA (CIA #2): 


Die beiden Ports werden hauptsaechlich fuer Datenuebertra- 
gung genutzt: 


Port A: Bit O und Bit 1 dienen zur Festlegung der Video-Bank 
fuer den VIC-II-Chip (hoechstvertige Adressbits VAl4 und 
VAl5). Bit 2 wird fuer die Datenausgabe der RS-232-Uebertra- 
gung verwendet. Die uebrigen Bits dienen dem Austausch von 
Daten ueber den seriellen Bus: 


Bit 3: ATN OUT (Attention-Leitung) 

Bit 4: CLOCK OUT (Taktleitung Ausgang) 
Bit 5: SERIAL OUT (Datenleitung Ausgang) 
Bit 6: CLOCK IN (Taktleitung Eingang) 
Bit 7: SERIAL IN (Datenleitung Eingang) 


Port B ist vollstaendig an den Userport " herausgefuehrt und 
im Normalfall unbenutzt. Allerdings erhalten die Portleitun- 
gen von Port B (mit Ausnahme von PB5) eine Bedeutung im Zu- 


99 -. 


sammenhang mit der RS-232-Schnittstelle, die auf den User- 
port aufgesteckt wird. Die Bedeutungen der Leitungen sind im 
Zusammenhang mit der Erklaerung des RS-232-Handlings erlaeu- 
tert. 


Timer A wird beim Senden von Daten ueber die RS-232-Schnitt- 
stelle verwendet und ist ansonsten unbenutzt. 


Timer B wird beim Empfangen von Daten ueber die RS-232- 
Schnittstelle verwendet und ist ansonsten unbenutzt. 


Die eingebaute Echtzeituhr wird in keiner Weise vom Be- 
triebssystem angesprochen und steht vollkommen frei fuer ei- 
gene Anwendungen. 


Wie bei der IRQ-CIA auch, so ist auch hier der Serielle Port 
vollkommen unbenutzt und ist fuer eigene Anwendungen an den 
User-Port (SP und CNT) herausgefuehrt. 


FLAG und PC zum Uebertragen von Daten mittels Handshaking 
sind (ausser beim RS-232-Handling, hier wird FLAG zur Erken- 
nung des Startbits herangezogen) unbenutzt und stehen am 
Userport frei zur Verfuegung. 


PINBELEGUNG DER CIA 


Pin 1 : GND, Masseleitung 

Pin 2 - 9: bidirektionale Portleitungen PAD bis PA7 
Pin 10 - 17: bidirektionale Portleitungen PBO bis PB7 
Pin 18 : PC/, Handshakeleitung fuer Port B, Ausgang 


Pin 19 : TOD, Eingang Netzfrequenz fuer "Time of Day" 
Pin 20 : VCC, Betriebsspannung von +5 Volt 
Pin 21 : IRQ/, Interruptleitung zum Prozessor (NMI, IRQ) 


Pin 22 : R/W, Eingang Schreib/Leseleitung des Prozessors 


Pin 23 : CS/, Kennzeichnung Zugriff auf CIA-Register 
Pin 24 : FLAG/, Handshakeleitung fuer Port B, Eingang 
Pin 25 : PH2, Systemtakt 2 fuer Prozessorbussteuerung 
Pin 26 - 33: DB7 bis DBO, Datenbus des Prozessors 
Pin 34 : RES/, Ruecksetzen der CIA in Ausgangszustand 
Pin 35 - 38: RS3 bis RSO, Registerauswahl bei CS/=0 
Pin 39 : SP serieller Port, Eingang oder Ausgang von SDR 
Pin 40 : CNT, Steuerleitung zu SDR oder fuer Timer 

GNE! 1 un {u 

PRAG 2 Be 

PRAIi ie. IS 

PAZ 4 Sr 

PA>3 I = 

PrA4 & 5 ie‘ 

PRS Y 4 

PRE b= 33 

PRA?T 9 32 

FRA a Ss 

FBi 1 a 

PB2 29 

PB3 23 

PE4 ev 

PRS 25 

PB& ea 

PB’ 24 

PC 23 

TCD 22 

YCC ai 


100 


DIE KONTROLLPORTS (Abfrage von Joysticks und Paddles) 


Der Commodore 64 verfuegt, im Gegensatz zum VIC-20, ueber 
zwei Kontrollports, die sich links vom Netzschalter befin- 
den. An jeden dieser Ports laesst sich entweder ein Joystick 
oder ein Paar Paddles anschliessen. Damit ist es zum Bei- 
spiel jetzt auch bei Spielen fuer zwei Personen moeglich, 
jedem Spieler einen Joystick zuzuordnen. Im folgenden wird 
dem linken Kontrollport die Nummer 1, dem rechten die Nummer 
2 zugeordnet (in Uebereinstimmung mit den Beschriftungen am 
Geraet selbst). Die beiden Ports sind in Bezug auf die Ab- 
frage von Joystick und Paddles funktionsgleich, Port 1 kann 
jedoch zusaetzlich zum Anschluss eines Lightpens verwendet 
werden. Doch laesst sich diese spezielle Eigenschaft des er- 
sten Ports vielleich von Fall zu Fall auch im Zusammenhang 
mit dem Joystick verwenden (siehe Erlaeuterung). 


Der Joystick 


Jeder Joystick ist ueber fuenf Signalleitungen, die alle an 
die IRQ-CIA 6526 (CIA #1) fuehren, mit dem Computer verbun- 
den. Dabei handelt es sich um die vier Leitungen fuer die 
vier Hauptrichtungen des Joysticks sovie um eine Leitung 
fuer den Feuerknopf. Die Joystickleitungen fuer den ersten 
Kontrollport sind an den Datenport B der CIA #1 (U2) ange- 
schlossen, die des zweiten Kontrollports sind mit Port A der 
gleichen CIA verbunden. Hier die genaue Uebersicht ueber die 
Bedeutungen der Portleitungen: 


Kontrollport #1 Kontrollport #2 


oben: Port BO Port AO 
unten: Port Bl Port Al 
links: Port B2 Port A2 
rechts: Port B3 Port A3 
Feuer: Port B4 Port A4 


Dass die zugehoerigen Datenrichtungsregister auf Eingang 
(Bitwert O0) geschaltet wurden, ist die Voraussetzung fuer 
ein einwandfreies Funktionieren jeder Abfrageroutine von Da- 
tenports. 


wird der Joystick nun in eine bestimmte Richtung gehalten 
(beziehungsweise der Feuerknopf gedrueckt), so ist das ent- 
sprechende Bit des Datenports geloescht, ansonsten gesetzt. 
Bei Diagonalrichtungen sind entsprechend die zwei Richtungs- 
bits, aus denen sich die Diagonalrichtung zusammensetzt, ge- 
loescht. 


Allerdings hat dieses ganze Prinzip einen recht gewichtigen 
Haken, der bestimmt jedem schon aufgefallen ist, der (bei 
eingabebereitem Computer) mit dem Joystick experimentiert 
hat: Es erscheinen Zeichen auf dem Bildschirm, obwohl kei- 
nerlei Taste gedrueckt wird (bei Anschluss an Kontrollport 
1) oder einzelne Tasten funktionieren nicht oder erzeugen 
falsche Zeichen (bei Anschluss an Kontrollport 2), wenn der 
Joystick benutzt wird. Dies resultiert aus der gemeinsamen 
Benutzung der Datenleitungen der IRQ-CIA sowohl fuer Joy- 
stick als auch Tastatur. Daher ist eine gleichzeitige (pa- 
rallele) Benutzung von Joystick und Tastatur nicht moeglich. 


Das folgende kurze Beispielprogramm fragt den Joystick des 


ersten Kontrollports ab und gibt entsprechend Meldung auf 
dem Bildschirm ab: 


101 


100 DIM A$ (4) : FOR I = O0 TO 4 : READ A$ (I) : NEXT 
110 DATA OBEN, UNTEN, LINKS, RECHTS, FEUER 

120 B = PEEK (56323) : POKE 56323, B AND 224 

130 P = PEEK (56321) : POKE 56323, B 

140 IF (P AND 31) = 31 GOTO 120 

150 FOR 1I1=207T04 

160 IF (P AND 2 % I) = O THEN PRINT A$ (I) " "; 

170 NEXT : PRINT : GOTO 120 


Um den zweiten Joystick abzufragen, muessen lediglich die 
Adressen 56321 in 56320 sowie 56323 in 56322 geaendert wer- 
den. Da die Anordnung der Leitungen identisch ist, ergeben 
sich keine weiteren Aenderungen. 


Die Abfrage der Diagonalrichtungen kann uebrigens gleichzei- 
tig mit der Abfrage der vier Hauptrichtungen erfolgen, so- 
dass nicht alle acht moeglichen Richtungen getrennt erkannt 
werden muessen: Soll zum Beispiel eine Spielfigur durch den 
Joystick gelenkt werden, so koennen durch aufeinanderfolgen- 
des Herausfiltern der einzelnen Bits (und, falls ein Bit ge- 
loescht ist, Verschiebung in die entsprechende Richtung) die 
Diagonalrichtungen gleich mitberuecksichtigt werden. 


Hierzu ein kurzes Beispiel: 


Die Position einer Figur (zum Beispiel eines Sprites) wird 
durch die Variablen X und Y festgelegt. Abfrage des Joy- 
sticks an Port 1 und Aenderung der entsprechenden Variablen 
durch folgendes Programm: 


B = PEEK (56323) : POKE 56323, B AND 224 
P = PEEK (56321) : POKE 56323, B 

IF (P AND 1) =O0O THENY=Y-] 

IF (P AND 2) = 0 THENY=Y+]1 

IF (P AND 4) =0O THENX = X -] 

IF (P AND 8) = O THENX = X +1 


In Maschinensprache laesst sich dies durch das Herausshiften 
von Bits und Abfrage durch die Carry (eventuell innerhalb 
einer Schleife mit vier Durchlaeufen) und indiziertem Laden 
des Wertes fuer die Erhoehung (Verminderung) des Wertes fuer 
die Position natuerlich wesentlich eleganter und kuerzer 
(und natuerlich schneller) erreichen. Die Abfrage der Feuer- 
taste hat sinnvollerweise getrennt zu erfolgen. 


Sollten sich aus der Tastaturabfrage des Betriebssystems 
durch die Routine SCNKEY im Zusammenhang mit der Abfrage der 
Joysticks Probleme ergeben (die eigene Routine wird beein- 
flusst oder aehnliches), so kann die Interruptroutine (gene- 
rell) abgeschaltet werden durch ... 


POKE 563353, 1 
Wieder eingeschaltet wird der IRQ durch ... 
POKE 56333, 129 


Allerdings kann waehrend dieser Zeit, in der IRQs nicht zu- 
gelassen sind, keinerlei Abfrage der Tastatur durch GET oder 
INPUT erfolgen (aber dies ist durch die gleichzeitige Benut- 
zung des Joysticks wohl gar nicht erwuenscht beziehungsweise 
moeglich). Auch sollte nach Beendigung der Abfrage des Joy- 
sticks der IRQ unbedingt wieder zugelassen werden. Ist das 
Programm naemlich beendet, so koennen ansonsten keinerlei 
Eingaben gemacht werden, da keine Tastendruecke mehr er- 
kannt werden. 


102 


Waehrend der Zeit abgeschalteten IRQs laeuft die interne 
(softwaremaessig realisierte) Uhr NICHT weiter. Auch die 
RUNSTOP-Taste wird nicht mehr abgefragt. RUNSTOP im Zusam- 
menhang mit RESTORE ist jedoch auch weiterhin moeglich. 


Die Paddles 


An einen Kontrollport laesst sich je ein Paar Paddles an- 
schliessen. Da jedoch der Sound-Baustein (SID 6581) des Com- 
modore 64 nur ueber zwei Analog/Digital-Wandler verfuegt, 
muss vor der Abfrage der Paddles angegeben werden, welches 
Paddlepaar bei der Abfrage gemeint ist. Nur die Feuertasten 
sind gleichzeitig abfragbar, da diese schliesslich nicht von 
einem A/B-Wandler abhaengig sind, sondern (wie auch die 
Joysticks) direkt mit den Ports der IRQ-CIA verbunden sind. 
Diese beiden B-Bit-Register (POT X und POT Y genannt) des 
SID 6581 fuer die Paddles geben die Stellung der Drehregler 
an. 


Die beiden Paddles werden gemaess der Position ihres Verbin- 
dungskabels am Stecker fuer den Kontrollport mit 'Paddle 
links' und 'Paddle rechts' bezeichnet. Es werden folgende 
Register verwendet: 


Paddle links: Paddle rechts: 
Drehregler: SID 6581, POT Y SID 6581, POT X 
Feuerknopf: CIA 6526, Portbit 2 CIA 6526, Portbit 3 


Auch hier gilt, dass das Bit fuer den Feuerknopf geloescht 
ist, wenn die Taste gedrueckt ist. 


Wie erkennbar, werden die gleichen Leitungen benutzt, vie 
von den Joysticks auch. Da aber an einen Kontrollport nicht 
gleichzeitig Joystick und Paddle anschliessbar sind, Tresul- 
tiert daraus auch kein Nachteil. Allerdings gelten auch hier 
die in Bezug auf Tastatur und Joystick gemachten Einschraen- 
kungen durch die gemeinsame Benutzung von Datenleitungen. 


Zuerst zu den Feuerknoepfen: Wie dies auch bei den Joysticks 
der Fall war, so ist auch hier dem linken Paddlepaar der 
Port B und dem rechten der Port A zugeordnet. Mit 'Portbit' 
in der obigen Uebersicht ist also jeweils das entsprechende 
Bit im zugeordneten Datenport (A oder B) gemeint. Hier noch 
einmal die Adressen der Register der CIA fuer die Kontroll- 
ports: 


56320: Portregister A 
56321: Portregister B 
56322: Datenrichtungsregister A 
56323: Datenrichtungsregister B 


Auch hier muessen natuerlich die entsprechenden Bits des 
Datenrichtungsregisters auf Eingang geschaltet werden, um 
die Feuerknoepfe abzufragen. 


Befindet sich ein Drehregler am RECHTEN Anschlag, so ent- 
haelt das entsprechende Register (SID 6581) den Wert 0, am 
LINKEN Anschlag einen Wert um 200 (Commodore-Paddles), in 
allen anderen Positionen einen entsprechenden Zwischenvert 
(diese Werte unterliegen auch bei konstanter Reglerstellung 
gewissen Schwankungen). Es ist moeglich, dass sich die Reg- 
lerwerte von Paddle zu Paddle etwas unterscheiden, dies 
sollte jedoch in Programmen zu keinerlei Problemen fuehren. 
Eventuell kann in einem Programm aber auch festgestellt ver- 
den (durch Anweisung an den Benutzer, den Regler zum linken 


103 


Der erste Wert wird nun in die Adresse 43, der zweite in die 

Adresse 44 geschlrieben. Nun kann der LOAD-Befehl (ohne Anga- 
be einer -Sekundaeradresse) vorgenommen werden (das zu laden- 

de Programm muss natuerlich ein Relativprogramm sein). Ist 

der Ladevorgang abgeschlossen, so muss der Pointer (43/44) 

wieder auf den Anfang des ersten Programms gesetzt werden. 

Dies erreicht man durch ... 


POKE 43, 1 : POKE 44, 8 


Sie haben so ervwirkt, dass beide Programme zu einem Programm 
zusammengefuegt wurden. 


Der Dateityp 5, der End-of-Tape-Block, wird zur Bandende- 
Kennzeichnung verwendet und wird oft hinter dem letzten File 
einer Cassettenseite abgespeichert, um unnoetiges weiteres 
Suchen zu vermeiden. Wird beim Laden anstelle eines Daten- 
oder Programmheaders ein solcher EOT-Block gefunden, so 
sollte eigentlich "?FILE NOT FOUND ERROR" ausgegeben werden. 
Allerdings geschieht dies aufgrund eines Fehlers im Be- 
triebssystem, der auch schon beim VIC-20 aufgetreten ist, 
nicht. Es wird die in diesem Zusammenhang sinnlose Meldung 
"2DEVICE NOT PRESENT ERROR" gegeben (vgl. 0S-Listing an den 
Stellen 62383 ff, 62806 ff, 63291 f sowie 57717 f). 


Wie koennen nun diese ganzen verschiedenen Dateiarten (und 
Bloecke) auf Band geschrieben werden? Hier eine Uebersicht 
darueber: 


SAVE "PROGRAMMNAME " Abspeicherung eines Programms als 
Relativprogramm (meist BASIC) 


SAVE "PROGRAMMNAME",1,1 wie oben, jedoch wird zusaetzlich 
ein EOT-Block am Ende gespeichert 


SAVE "PROGRAMMNAME",1,2 Abspeicherung eines Programms als 
Absolutprogramm (meist 6502-Code) 


SAVE "PROGRAMMNAME",1,3 wie oben, jedoch wird zusaetzlich 
ein EOT-Block am Ende gespeichert 


Bei den letzten beiden Beispielen wird es meist noch noetig 
sein (falls das Maschinenprogramm auf diese Weise und nicht 
ueber eine Maschinenroutine gespeichert wird), die Start- 
und Endadresse (plus eins) des Maschinenprogramms festzule- 
gen. Dies erreicht man durch Zerlegung beider Adressen je- 
weils in LSB und MSB. Diese muessen dann in den Pointer fuer 
die Startadresse (43/44) und Endadresse (45/46) von BASIC- 
Programmen geschrieben werden. Dann kann das SAVE-Kommando 
gegeben verden. 


Beim Eroeffnen von Files auf Cassette gibt es folgende drei 
Moeglichkeiten: 


OPEN 1], 1, O0, "FILENAME" Eroeffnung eines Lesefiles 
OPEN 1, 1, 1, "FILENAME" Eroeffnung eines Schreibfiles 
OPEN 1, 1, 2, "FILENAME" Eroeffnung eines Schreibfiles 


mit zusaetzlicher Abspeicherung 
eines EOT-Blocks nach "CLOSE" 


Beim Laden von Programmen, dazu gehoert auch der VERIFY-Be- 
fehl, gibt es zwei Arten des Ladens: 


104 


Lightpen (Lightgun) 


An den ersten Kontrollport kann ein Lightpen angeschlossen 
werden. Dieser setzt, wenn seine Elektronik den Zeilen- 
strahl, der das Bild auf dem Bildschirm aufbaut, erkennt, 
die Leitung fuer die Feuertaste des Joysticks auf Lowpegel. 
Da die Steuerleitung fuer die Feuertaste jedoch nicht nur 
mit der IRQ-CIA verbunden ist, sondern auch mit dem Light- 
pen-Input (active low), wird die Position des Zeilenstrahls 
im Augenblick der negativen Flanke vom VIC-II-Chip aus in 
ein anderes Register uebertragen, das dann zur Erkennung der 
Position des Lightpens dient. Ausserdem wird bei aktivem 
Lightpen-Input ein Interrupt ausgeloest (sofern zugelassen), 
sodass das Computerprogramm nur dann die Lightpen-Position 
feststellen muss, wenn es ueberhaupt noetig ist (per Inter- 
ruptprogramm). Eine Lightgun wird jedoch noch mehr Verbin- 
dungen zum Computer besitzen. So zum Beispiel eine Feuerta- 
ste, die dann auch wirklich diese Funktion hat (dann aber 
natuerlich nicht mehr mit der normalen Feuerleitung abge- 
fragt werden kann), da die Leitung zur Feststellung der Po- 
sition wohl fuer ein Spiel nicht ausreicht. 


Da der Joystick des ersten Kontrollports jedoch auch mit 
diesem Lightpen-Input verbunden ist, laesst sich dadurch die 
Feuertaste (zum Beispiel waehrend des Demo-Modus' bei einem 
Spielprogramm oder nach Beendigung des Spiels) auch zum Neu- 
start des Spiels verwenden, ohne dass die Taste abgefragt 
verden muss. Es wird nur eine Interruptroutine benoetigt 
(die beim Druecken der Feuertaste aufgerufen wird, wenn das 
zugehoerige Interrupt-Enable-Bit gesetzt wurde), die dann 
einfach einen Neustart vornimmt. Natuerlich ist diese Anwen- 
dung nur dann sinnvoll, wenn eine gewoehnliche Abfrage der 
Feuertaste aufgrund der zeitlichen Ausdehnung einiger Pro- 
grammroutinen den Benutzer zu lange warten liesse. Man 
koennte zwar in jeder Routine die Taste abfragen, sodass 
niemals zu lange auf eine Reaktion gewartet werden muesste, 
dies koennte jedoch den Programmablauf verlangsamen oder zu 
speicherplatzaufwendig sein. 


Detailliertere Informationen in Bezug auf die Auswirkungen 


und Zusammenhaenge des Lightpen-Inputs auf den VIC-II-Chip 
finden sich bei der Erklaerung des Video-Chips. 


105 


DATENSPEICHERUNG AUF CASSETTE UND DISK 


Der Commodore 64 bietet recht komfortable Befehle zur Daten- 
speicherung, wozu auch die Speicherung von Programmen ge- 
hoert. Dabei stehen Ihnen prizipiell zwei vom Betriebssystem 
unterstuetzte Moeglichkeiten zur Verfuegung: 


l. die Speicherung auf Cassette sovie 


2. die Speicherung aüf einem Geraet, das an den seriellen 
Bus anschliessbar ist, meist wohl ein Diskettenlaufverk. 


Der Cassettenrecorder ist das wohl guenstigste Medium, um 
Daten (meist Programme) zu speichern. Dies bringt jedoch 
einige erhebliche Nachteile mit sich. Der wohl erheblichste 
Nachteil ist, dass Daten nur direkt hintereinander geschrie- 
ben und in der gleichen Reihenfolge auch wieder gelesen ver- 
den koennen. Genausovwenig koennen Daten an eine Datei ange- 
fuegt oder Inhalte einer Datei geaendert werden. Dazu muess- 
te die gesamte Datei gelesen, modifiziert und wieder auf 
Band geschrieben werden. Waehrend dieser Nachteil bei Pro- 
grammen nicht so gravierend ist (schliesslich hat man ja ein 
Zaehlverk, an dem man sich orientieren kann), so ist dies 
doch bei der Datenspeicherung, speziell bei voneinander ab- 
haengigen Dateien, ein solches Handicap, sodass bei komple- 
xeren Dateiverwaltungen auf eine Diskettenstation wohl nicht 
verzichtet werden kann. 


Ein weiterer, schwerwiegender Nachteil ist die Geschwindig- 
keit der Datenuebertragung auf Band. Waehrend selbst ein 
langes Programm in nur einigen Sekunden von Diskette gelesen 
werden kann, so koennen beim Laden von Cassette schon einige 
Minuten (zuzueglich der Zeit fuer das Umspulen der Cassette) 
zusammenkommen. 


Datenspeicherung auf Cassette 


Sollen Daten auf Band geschrieben werden, so wird erst ein- 
mal ein Vorspann, bestehend aus einem hohen Ton, auf Casset- 
te geschrieben. Darauf folgt ein sogenannter "Header", der 
(genauso wie das auf den Header folgende Programm oder der 
Datenblock) zweimal hintereinander geschrieben wird, um Feh- 
ler, die beim Lesen eventuell auftreten, korrigieren zu 
koennen. Die Commodore-Computer koennen maximal 31 Fehler 
pro Block (das kann ein Header, ein ganzes Programm oder ein 
Datenblock sein) korrigieren, wenn im zweiten Block diese 
Daten lesbar vorhanden sind. Werden auch beim Lesen des 
zweiten Blocks Fehler in den Bytes, die im ersten Block 
nicht lesbar waren, erkannt, so wird Bit 4 der Statusvaria- 
blen ST gesetzt. Ist ein Blockende erkannt worden, ohne dass 
alle Daten gelesen werden konnten, so wird Bit 2 (short 
Block) gesetzt. Entsprechend vird Bit 3 (long Block) ge-b 
setzt, wenn bereits alle Daten gelesen wurden, ohne dass ein 
Blockende erkannt wurde. Als eine weitere Fehlermoeglichkeit 
besteht der sogenannte Pruefsummenfehler (Bit 5). Dieser 
tritt auf, wenn die beim Abspeichern des Programms mitgege- 
bene Pruefsumme (sie entsteht aus der Exklusiv-Oder-Ver- 
knuepfung saemtlicher Datenbytes) nicht mit der beim Lesen 
errechneten (erwarteten) Pruefsumme uebereinstimmt. 


Bei der Speicherung von Daten werden diese vor der Abspei- 
cherung erst einmal in einem Puffer von 192 Bytes im Bereich 
von 828 bis 1019 gesammelt, der dann, wenn er gefuellt ist 
(beziehungsveise, wenn das File geschlossen wird), auf Band 
geschrieben wird. Aehnliches erfolgt beim Einlesen: Es wird 
immer ein ganzer Datenblock auf einmal gelesen (auch wieder 


106 


in den Bereich von 828 bis 1019), aus dem dann die Daten 
stueckweise durch Befehle wie GET# und INPUT# geholt werden. 
Wuerden die Daten immer direkt auf Band geschrieben (bezie- 
hungsweise von Band geholt werden), so muesste man jedesmal 
den Vorspann, die Synchronisationsbytes und alles andere 
mitschreiben (da sonst die Daten nicht fehlerfrei gelesen 
werden koennten, schliesslich muss der Recordermotor erst 
wieder anlaufen), egal wie kurz der Block waere. Da dadurch 
jedoch die Geschwindigkeit noch weiter herabgesetzt werden 
wuerde, hat man sich wohl fuer das Puffer-Prinzip entschie- 
den. 


Der eben schon erwaehnte Header enthaelt die Informationen 
darueber, um welche Art von Datenfile es sich bei dem fol- 
genden handelt. Ausserdem ist in ihm der Programmname (oder 
Filename) und, falls es sich um ein Programm handelt, die 
Start- und Endadresse enthalten. Der Header wird, genauso 
vie die Datensaetze (die prizipiell ihr eigener Header 
sind), im Cassettenpuffer aufgebaut und dorthin auch wieder 
eingelesen. 


Hier der Aufbau des Headers: 


Adresse 828: Kennzeichnung fuer Dateityp 
829 bis 830: Startadresse des Programms (low, high) 
831 bis 832: Endadresse+l des Programms (low, high) 
833 bis 848: Filename (Ausgabe bei "FOUND") 
849 bis 1019: Filename (keinerlei Ausgabe) 


Wird beim Abspeichern eines Programms (oder beim schreiben- 
den Eroeffnen eines Files) ein Filename (bestehend aus mehr 
als 16 Zeichen) angegeben, so werden diese "ueberschuessi- 
gen" Zeichen durchaus abgespeichert, da maximal 187 Zeichen 
als Filename zugelassen werden. Allerdings werden beim Ein- 
lesen nur noch die ersten 16 Zeichen ausgegeben, die restli- 
chen bleiben unsichtbar, koennen jedoch mittels CHR$ und 
PEEK ausgelesen werden. Diese weiteren Zeichen werden jedoch 
beachtet, wenn beim lesenden Zugriff auf Band, sei es durch 
LOAD, VERIFY oder OPEN, der Filename des zu suchenden Files 
angegeben wird. Ist dieser naemlich laenger als 16 Zeichen, 
so wird fuer den Vergleich, ob das richtige File gefunden 
wurde, auf den "unsichtbaren" Rest des fFilenamens zugegrif- 
fen. Die Verwendung von Filenamen mit mehr als 16 Zeichen 
ist jedoch bei der normalen Verwendung des Bandgeraets un- 
veblich. 


Als Kennzeichnung fuer den Dateityp (Adresse 828) stehen 
folgende Moeglichkeiten zur Auswahl: 


Relativprogramm (wird an BASIC-Startadresse geladen) 
Datenblock, folgende 191 Bytes sind Daten (Filehandling) 
Absolutprogramm, wird an angegebene Stelle geladen 
Dateiheader, folgende Bloecke sind Datenbloecke 

End of Tape (EOT) Block, Kennzeichnung fuer Bandende 


n£e£UuN 
. eo . 0.0. 00 


Der Dateityp 2 gibt an, dass es sich bei diesem Block um Da- 
ten handelt, die mittels PRINT# auf Band geschrieben wurden 
und durch GET# und INPUT# gelesen werden koennen. 


Dieser Blocktyp enthaelt selbst keinen Programmnamen, dieser 
steht zu Beginn des Files (es koennen. mehrere Bloecke vom 
Typ 2 hintereinander stehen, je nach Laenge der Datei) im 
Dateiheader (Headertyp 4), der beim lesenden Zugriff unbe- 
dingt gefunden werden muss, da der Computer ansonsten nichts 
mit den folgenden Datenbloecken anfangen kann. 


107 


Die Dateitypen 1 und 3 werden fuer die Speicherung von Pro- 
grammen verwendet. In diesen beiden Faellen sind auch die 
vier Bytes nach dem Kennungsbyte innerhalb des Dateiheaders 
benutzt. Sie enthalten die Startadresse und die Endadresse 
(plus eins, wie dies bei den meisten Endpointern der Fall 
ist) des Programms. Diese wird beim Schreiben auf Band fest- 
gestellt und dem Header mitgegeben. 


Handelt es sich bei dem gelesenen Header um Typ 3, so wird 
das Programm an die Adresse geladen, an der es sich befand, 
als es auf Cassette gespeichert wurde. Dies kann bei Maschi- 
nenprogrammen sehr nuetzlich sein, da dann das Transferieren 
in den Speicherbereich, in dem sie ablaufen sollen, ent- 
faellt. Auch koennen solcherart abgespeicherte Programme 
nachtraeglich eingeladen werden, ohne dass ein schon im AT- 
beitsspeicher befindliches BASIC-Programm (sofern es nicht 
in den vom Maschinenprogramm belegten Bereich hineinreicht) 
ueberschrieben wird. Allerdings muss auch hier die folgende 
Vorgehensweise beachtet werden: 


Vor dem Einladen des Programms muss der Wert des Pointers 
(45/46) gemerkt werden. Dies kann einfach durch PEEK erfol- 
gen. Nun koennen Sie das gewuenschte Maschinenprogramm, das, 
wie gesagt, nicht im gleichen Bereich liegen darf wie das 
schon im Arbeitsspeicher befindliche BASIC-Programm, nachla- 
den. Ist der Ladevorgang abgeschlossen, so stellen sie den 
alten Wert des Pointers (45/46) durch POKE wieder her. Die- 
sen POKEs muss unbedingt (!) ein CLR folgen, damit auch die 
zugehoerigen anderen Pointer richtig gesetzt werden. Auch 
muss bedacht werden, dass das eingeladene Maschinenprogramm 
(je nach Lage) vielleicht vor dem Zugriff durch das Be- 
triebssystem geschuetzt werden muss. 


Bei dem Dateityp 1] handelt es sich meist um BASIC-Programme, 
deren Startadresse (im Normalfall) unbeachtet bleibt. Statt- 
dessen werden sie an die Startadresse des BASIC-Bereichs 
(Standardvert 2049) geladen. Allerdings kann auch bei diesem 
Programmtyp ein Laden in den urspruenglichen Programmbereich 
erzwungen werden. Dies erreicht man durch einen LDAD-Befehl 
mit Sekundaeradresse ungleich null. 


Durch den Programmtyp des Relativprogramms kann 'ein Zusam- 
menhaengen von Programmen erreicht werden. Dazu muss einfach 
der Pointer auf die Startadresse von BASIC-Programmen 
(Adressen 43 und 44) auf das Ende des im Arbeitsspeicher be- 
findlichen Programms gesetzt werden. Allerdings muss das an- 
zuhaengende Programm groessere Zeilennummern haben, als das 
im Arbeitsspeicher befindliche Programm. Hier die genaue 
Angabe der Methode: 


Feststellung der Endadresse des Programms im Arbeitsspeicher 
durch 


E = PEEK (45) + 256 * PEEK (46) 


Von diesem Wert muss nun der Wert zwei subtrahiert werden 
(siehe: Interne Codierung von BASIC-Programmen) ... 


E=-E-2 


Dieser Wert muss nun wieder in zwei Bytes zerlegt werden. 
Dies geschieht durch 


PRINT E - 256 * INT (E / 256), INT (E / 256) 


108 


und rechten Anschlag zu drehen), wo die Minimal- und Maxi- 
malwerte liegen. 


Die Register, aus denen die Werte fuer die Drehregler ausge- 
lesen werden koennen, befinden sich an den Adressen 54297 
(POT X, Paddle rechts) und 54298 (POT Y, Paddle links). Da 
wohl nur selten alle 256 Werte (oder 200, siehe oben) sich 
in der Darstellung auf dem Bildschirm voneinander unter- 
scheiden werden, ist es wohl sinnvoll, entweder nur Werte 
innerhalb bestimmter Grenzen zu verarbeiten und darueber hi- 
nausgehende Werte als Maximal- beziehungsweise Minimalvert 
zu betrachten. Eine andere - jedoch aufvendigere - Methode 
waere, den Wert aus dem Register so zu dividieren, dass ge- 
nau die Spanne an Werten herauskommt, die fuer die Verarbei- 
tung sinnvoll ist. 


Jetzt fehlt nur die Information darueber, wie die beiden 
Paddlepaare bei Abfrage des Reglervwertes ausgewaehlt werden 
koennen. Die Auswahl erfolgt ueber Bit 6 und 7 von Port A 
der IRQ-CIA. Wie sofort erkennbar, entstehen auch hier wvie- 
der Konflikte mit der Tastatur, die sich hier jedoch durch 
Abschalten des Interrupts verhindern lassen. 


Ist Bit 6 dieses Ports gesetzt und Bit 7 geloescht, so sind 
die Register POT X und POT Y des SID 6581 dem linken Paddle- 
paar (Kontrollport 1) zugeordnet. Ist dahingegen Bit 6 ge- 
loescht und Bit 7 gesetzt, so kann die Reglerstellung des 
rechten Paddlepaares (Kontrollport 2) festgestellt werden. 
Nach so viel theoretischer Erklaerung auch hierzu wieder ein 
Beispielprogramm ... 


100 PA 56320 : PB = 56321 : DB = 56323 : CA = 56333 
110 PY 54298 : PRINT CHR$ (147) 

120 PRINT " KONTROLLPORT 1 KONTROLLPORT 2 

130 PRINT " PADDLE PADDLE 

140 PRINT " LINKS RECHTS LINKS RECHTS" : PRINT : PRINT 
150 PRINT CHR$ (145); : POKE CA, 1: FOR I =0T01 

160 POKE PA, 127 + 64 * IT : D = PEEK (DB - I) 

170 POKE DB - I, D AND 243 : P = PEEK (PB - I) 

180 POKE DB - I, D : PRINT" "; : FOR IJ =0T0O1 

190 IF (P AND 2 ? (3 - J)) = DO THEN PRINT CHR$ (18); 

200 PRINT RIGHT$ (" " + STR$ (PEEK (PY - J)), 4); 

210 PRINT " " CHR$ (146) SPC(3); =: NEXT : NEXT : PRINT 

220 POKE CA, 129 : GET G$ : IF G$ CD) CHR$ (13) GOTO 150 


Das Programm gibt zu jedem der vier moeglichen Paddles den 
jeweiligen Wert des Drehreglers an. Ist ausserdem die Feuer- 
taste gedrueckt, so wird der Wert winvertiert (in Negativ- 
schrift) dargestellt. Das Programm laesst sich durch Druek- 
ken von RETURN abbrechen (durch den abgeschalteten IRQ muss 
die Taste eventuell laenger gedrueckt gehalten verden). 


109 


LOAD "PROGRAMMNAME" Lesen eines Programms, wie es im 
Programmheader angegeben wurde. 
(also’ Absolut oder Relativ) 


LOAD "PROGRAMMNAME",1,] Absolutes Einladen eines Programms 
in den im Header spezifizierten 
Speicherbereich 


Noch eine Anmerkung zur Speicherung (speziell von Maschinen- 
programmen): Der Commdore 64 kann, im Gegensatz zu allen 
vorherigen Modellen von Commodore, ohne zusaetzliche Hilfs- 
programme auch den Speicherbereich ab 32768 auf Cassette 
speichern. Dies ist beim Commodore 64 noetig geworden, da 
BASIC-Programme ja auch in den Bereich ueber 32767 hinein- 
reichen koennen. So ist es aber nun zum Beispiel auch moeg- 
lich, den 4-KB-RAM-Bereich von 49152 bis 53247, in dem sich 
viele Maschinenutilities unterbringen lassen, auf Cassette 
zu speichern. 


Datenspeicherung auf Diskette 


Der Vorteil beim Arbeiten mit fFloppy-Disc liegt darin, dass 
beliebig auf jeden einzelnen Block einer Diskette zugegrif- 
fen werden kann. So muss auch beim Lesen und Schreiben auf 
Diskette nicht erst der Kopf durch getrennte Befehle posi- 
tioniert werden. Dies alles erfolgt automatisch durch das 
Diskettenbetriebssystem. Wird ein verlangtes File nicht ge- 
funden, so wird die Fehlermeldung "?FILE NOT FOUND ERROR" 
gegeben. 


Beim Abspeichern von Programmen auf Diskette kann nicht spe- 
zifiziert werden, ob es sich um ein Maschinenprogramm han- 
delt (die Angabe eines EOT-Blocks ist sowieso unsinnig). 
Dies wird beim Einladen angegeben, aehnlich, wie es auch bei 
Cassette moeglich var: 


LOAD "PROGRAMMNAME",B Einladen eines Programms an den 
Speicheranfang (BASIC-Programme) 


LOAD "PROGRAMMNAME",B,1 Einladen eines Programms an den 
beim Abspeichern angegebenen 
Speicherbereich 


Auch beim Laden von Diskette ist das Zusammenhaengen von 
BASIC-Programmen moeglich. Hierzu muss genauso vorgegangen 
verden, wie beim APPEND von Cassette. Die Abspeicherung von 
Maschinenprogrammen erfolgt wie bei Cassette auch, jedoch 
wird bei der Abspeicherung auf Diskette keinerlei Sekundaer- 
adresse angegeber. Dies ist zwar moeglich, es hat aber kei- 
nerlei Auswirkung auf den Abspeicherungsvorgang. 


Nun zu den internen Vorgaengen beim Abspeichern und Einlesen 
von Programmen im Zusammenhang mit Diskette: 


Wird ein Programm auf Diskette geschrieben, so wird ein file 
mit der Sekundaeradresse 1 eroeffnet. Dies ist fuer die Conm- 
modore-Laufwerke der Hinweis dafuer, dass ein Datenfile vom 
Typ "PRG" eroeffnet werden soll. Die ersten beiden Bytes, 
die dann auf dieses file ausgegeben werden, sind die Start- 
adresse des Programms in Low/High-Darstellung. Eine End- 
adresse wird nicht mitgegeben. Das Programmende bei der Da- 
tenuebertragung wird der Floppy-Disk durch ein EOI mitge- 
teilt. 


Das Einlesen erfolgt durch Eroeffnung eines Files mit der 
Sekundaeradlresse 0. Auch diese spezielle Sekundaeradresse 


110 


ist ein Hinveis fuer die Diskettenstation: Es wird ein File 
vom Typ "PRG" zum Lesen eroeffnet. Dann werden die ersten 
beiden Bytes gelesen und als Ladezeiger gespeichert. Diese 
beiden Bytes werden jedoch nur dann auch als Ladezeiger ver- 
wendet, wenn eine Sekundaeradresse ungleich null dem LOAD- 
Kommando mitgegeben wurde. Ansonsten wird cas Programm in 
den fuer BASIC-Programme vorbereiteten Bereich geladen. 


So kann zum Beispiel die Startadresse eines Programms auf 
Diskette durch folgendes kurzes Segment festgestellt werden: 


OPEN 1, 8, O, "PROGRAMMNAME" : GET#1, L$, H$ : CLOSE 1 
PRINT ASC (L$ + CHR$ (0)) + 256 * ASC (H$ + CHR$(0)) 


Durch Angabe der Sekundaeradresse O wird der LOAD-Befehl si- 
muliert, wodurch weitere Angaben innerhalb des Filenamens 
entfallen. Der Zusatz 'CHR$(0)' wird benoetigt, da das Be- 
triebssystem bei GET# den Leerstring anstelle des Nullcodes 
uebermittelt. Der ASC ist fuer den Leerstring allerdings 
nicht definiert. Daher wird diese Stringaddition vorgenon- 
men. 


OVERLAY (Nachladen von Programmen unter Programmkontrolle) 


wird der LOAD-Befehl (unabhaengig vom angesprochenen Geraet) 
innerhalb eines Programms gegeben, so wird nach dem Einladen 
des Programms der CHRGET-Pointer auf den Anfang des BASIC- 
Bereichs gesetzt. Ein nachgeladenes Programm wird daher so- 
fort gestartet. Aber Achtung: Um die Variableninhalte nicht 
zu zerstoeren (sie koennten im nachgeladenen Programm ja 
noch benoetigt werden), wird keinerlei CLR ausgefuehrt. Auch 
wird der BASIC-Endepointer (Variablenanfangspointer) nicht 
gesetzt, er behaelt seinen alten Wert bei. Ein nachgeladenes 
Programm darf daher niemals laenger als das aufrufende Pro- 
gramm sein. Auch muss beachtet werden, dass ein nachgelade- 
nes Programm niemals wieder abgespeichert werden sollte. 
Schliesslich stimmen die Endezeiger nicht, so dass das Pro- 
gramm mehr Platz belegen wuerde, als wirklich notwendig wae- 
re. 


Hier noch die Einschraenkungen bei der Uebernahme von Varia- 
blen: Stringinhalte, die direkt zugewiesen wurden, werden 
nicht uebertragen (der Stringdescriptor zeigt direkt in den 
BASIC-Text). Dies kann jedoch durch Addition des Leerstrings 
umgangen werden. Also beispielsweise 


A$ = "STRINGINHALT" + "" 
anstelle von 
A$ = "STRINGINHALT" 


Auch muessen ueber 'DEF' definierte Funktionen neu definiert 
verden, da auch der Pointer des 'FN-Variableneintrags' di- 
rekt in den BASIC-Text zeigt, der jedoch nach dem Nachladen 
nicht mehr in dieser Form vorhanden ist. Eine genaue Erklae- 
rung der Abspeicherung von FN-Variableneintraegen findet 
sich bei der Erklaerung der Darstellung und Ablage von Va- 
riablen. 


Werden die Variableninhalte aus dem aufrufenden Programm je- 
doch nicht mehr weiter benoetigt und koennen daher geloescht 
werden, so empfiehlt es sich, das Kommando zum Nachladen 
durch den Tastaturpuffer zu geben. Dies kann fuer Diskette 
erfolgen durch 


111 


A$ = "PROGRAMMNAME " 

PRINT CHR$ (147) : PRINT 

PRINT "LOAD" CHR$ (34) A$ CHR$ (34) ",8" 

PRINT : PRINT : PRINT : PRINT : PRINT "RUN" CHR$ (19); 
POKE 631, 13 : POKE 632, 13 : POKE 198, 2 

END 


Dieses Programm schreibt den auszufuehrenden Text auf den 
Bildschirm und laesst diesen dann durch ein simuliertes 
Druecken der RETURN-Taste interpretieren. 


Es ist auch moeglich, wenn der Ladebefehl im Programm gege- 
ben wurde (und nicht ueber den Tastaturpuffer), die BASIC- 
Endepointer nach dem Pointer (174/175) zu setzen, da dieser 
die Endadresse des soeben geladenen Programms angibt. Aller- 
dings verlangt diese Programmierung eine Kontrolle, da, venn 
das Programm nach einer Aenderung direkt mittels "RUN" ge- 
startet wird, die Endepointer dann falsch gesetzt werden. 
Eine Moeglichkeit des Abfangens dieses Effektes bestuende 
darin zu pruefen, ob der Variablenendepointer gleich dem Va- 
riablenanfangspointer ist. Dies ist schliesslich nach dem 
Starten eines Programms durch "RUN" der Fall, waehrend es 
beim Nachladen nicht der Fall ist (die Variableninhalte 
bleiben erhalten). 


Soll vom Hauptprogramm aus ein Maschinenprogramm nachgeladen 
werden, so hat das Nichtsetzen der Endepointer den grossen 
Vorteil, dass das Programm ungestoert wveiterlaufen kann. 
Hier ein Beispiel fuer einen Programmanfang, der ein benoe- 
tigtes Maschinenprogramm nachlaedt: 


100 IF A = O0 THEN A = 1 : LOAD "MASCHINENPROGRAMM", 8 
110 ... 


Da nach dem Starten eines Programms durch "RUN" saemtliche 
Zahlenvariablen den Wert null haben, werden die Befehle nach 
der IF-Abfrage ausgefuehrt. Die Variable A wird nun aber auf 
den Wert eins gesetzt. Nachdem das Maschinenprogramm nachge- 
laden wurde, werden die CHRGET-Pointer auf den Programman- 
fang gesetzt, die Variableninhalte jedoch nicht geloescht. 
Nun hat die Variable A jedoch nicht mehr den Wert null, es 
wird in der naechsten Zeile mit der- Programmausfuehrung 
fortgefahren. | 


Dieser Effekt laesst sich auch verwenden, wenn man nach- 
traeglich zum Beispiel Maschinenutilities nachladen will. 
Man gibt dazu in das momentan vorhandene BASIC-Programm (das 
die Zeilen DO und 1 nicht enthalten darf) nur ein 


0 END 
1 LOAD "MASCHINENPROGRAMM" 


... und startet es durch ... 
RUN 1 


Das Maschinenprogramm wird nun nachgeladen, ohne dass etwas 
weiteres geschieht. Man erspart sich so das Merken und Wie- 
derherstellen der Pointer auf das Ende des BASIC-Programnms. 
Allerdings sollte man die beiden Programmzeilen nach Aus- 
fuehrung wieder entfernen. 


112 


PRAKTISCHE ANWENDUNG DER "TIME OF DAY" 


Wer die softwaremaessig realisierte Uhr des Commodore 64 
(ueber die Systemvariablen TI und TI$ abfragbar) schon ein- 
mal ueber laengere Zeit hat arbeiten lassen, der weiss, dass 
diese nicht unbedingt als genau zu bezeichnen ist (circa 
zwei Prozent Abweichung), was aber bei dieser Art der Ver- 
wirklichung leider nicht vermeidbar ist. 


Daher wird man vielleicht eine der in den CIAs eingebauten 
Uhren einmal verwendet haben. Da diese von der Netzfrequenz 
getaktet werden, weisen sie eine sehr hohe Ganggenauigkeit 
auf. Allerdings ist die Benutzung dieser Uhren (die vom 
hardwaremaessigen Konzept her sehr gut durchdacht sind) mit 
einigen Problemen verbunden. Das Arbeiten mit den beiden Uh- 
ren wird in keiner Weise direkt vom Betriebssystem unter- 
stuetzt. Man muss also eine eigene Abfrageroutine erstellen, 
die die Inhalte der vier Register in irgendeiner Form so 
verarbeitet, dass man die Uhrzeit in einem brauchbaren For- 
mat vorliegen hat. Auch das Setzen der Uhrzeit kann nicht 
mehr einfach durch Zuweisung erfolgen. Zuerst muss die Uhr- 
zeit in einzelne Ziffern zerlegt werden, die dann abgespei- 
chert werden. Abgesehen davon werden Stunden nicht mehr im 
Bereich von O Uhr bis 23 Uhr, sondern von 1] Uhr bis 12 Uhr 
angegeben (zusammen mit dem Hinweis, ob es Vormittag oder 
Nachmittag ist). Man wird daher, so gut das BASIC-Unterpro- 
gramm auch sein man, nicht mit dem Komfort arbeiten koennen, 
wie man ihn von "TI$" her gewohnt ist. Ausserdem tritt (je- 
denfalls bei einer Netzfrequenz von 50 Hertz) ein weiteres 
Problem auf: Sobald man ein Programm mittels "RUNSTOP/RE- 
STORE" abbricht, geht die Uhr auffaellig nach. Dies liegt 
daran, dass die Flag fuer die Taktfrequenz (MSB von CRA) 
beim Druecken von "RUNSTOP/RESTORE" sofort auf 60 Hertz zu- 
rueckgesetzt wird. Man muesste also bei jedem Druecken die- 
ser beiden Tasten diese Flag wieder neu setzen. 


Ausserdem scheint bei der Entwicklung der CIAs ein Fehler 
(?) aufgetreten zu sein: Versucht man das Stundenregister 
auf 12 Uhr zu setzen, so wird der gespeicherte Flagvwert fuer 
AM/PM sofort umgekehrt. Stellt man also 12 Uhr nachmittags 
ein, so zeigt die Uhr zwoelf Uhr vormittags (nachts) an (und 
umgekehrt). 


All dieses wurde durch ein kurzes Maschinenprogramm besei- 
tigt: Man kann genauso komfortabel (wenn nicht komfortabler) 
mit der eingebauten Uhr arbeiten, wie mit "TI$" auch. Es ist 
moeglich, die Uhrzeit festzusetzen und sie wieder auszule- 
sen. All dies geschieht ueber die USR-Funktion des Commodo- 
re-BASICs. Um die Uhrzeit festzusetzen, muss einfach nur 
eingegeben werden 


A = USR ("hhmmsst") 


Dabei steht "hh" fuer die Stunden (von O bis 23!), "mm" fuer 
die Minuten, "ss" fuer die Sekunden (beides von 0 bis 59) 
sowie "t" fuer die Zehntelsekunden. Es existiert also eine 
Stelle mehr, als bei "TI$". Ist die Uhrzeit korrekt angege- 
ben worden, so enthaelt die Variable "A" den Wert null. Wur- 
de das Format missachtet (falsche Laenge, keine Ziffern, 
falscher Bereich fuer Stunden, Minuten oder Sekunden), so 
enthaelt "A" den Wert "-1". So ist also keine Ueberpruefung 
der Eingabe durch das Programm noetig. Es wird der Wert 
mittels USR an das Maschinenprogramm uebergeben, worauf die- 
ses dann meldet, ob die Eingabe korrekt war. Fuer "A" kann 
natuerlich jede andere numerische Variable stehen. 


113 


au 
1108 
12a 
130 
144 
150 
168 
170 
134 
170 
zagı 
2108 
22a 
238 
240 
250 
284 
ra 
era 


Das Lesen der Uhrzeit erfolgt durch ... 
A$ = USR (beliebiger numerischer Ausdruck) 


Anstelle von A$ kann natuerlich eine andere Stringvariable 
stehen. Auch die Weiterverarbeitung des Ergebnisses winner- 
halb eines Ausdrucks ist moeglich. Die Funktion liefert die 
Uhrzeit in genau dem Format, wie es auch eingegeben werden 
muss. 


Auch das Druecken von "RESTORE" ist mit keinerlei Gefahren 
fuer die Genauigkeit mehr verbunden, da das Programm ausser 
dem USR-Vektor auch noch den NMI-Vektor "umbiegt". Es er- 
folgt also eine eigene Behandlung des NMIs, sodass die Flag 
fuer die Netzfrequenz beim I/O-Reset immer auf .SQN Hertz ge- 
setzt wird. Die eigene Behandlung eines gedrueckten "RE- 
STORE" hat allerdings einen kleinen Nachteil: Befindet sich 
ein Steckmodul im Commodore 64, das seinen eigenen Vektor 
fuer die NMI-Routine besitzt, so bleibt dieser Vektor fortan 
unbeachtet, da es ja sein koennte, dass diese eigene Routine 
auch die Flag wieder auf 60 Hertz setzt. 


Das Maschinenprogramm liegt im Bereich ab 49152, der vom BA- 
SIC nicht benutzt wird. Das Aendern fuer andere Bereiche 
duerfte jedoch nicht schwer fallen, da das Programm im Prin- 
zip recht logisch aufgebaut ist. Wird bei der Eingabe der 
DATA-Zeilen ein Fehler gemacht, so wird dieser in den mei- 
sten Faellen durch das Programm bemerkt. Ist das Maschinen- 
programm durch den BASIC-Traeger abgelegt worden, so kann es 
durch ... 


SYS 49152 


... aktiviert werden. Es werden der USR- und der NMI-Vektor 
auf eigene Routinen gesetzt sowie die Taktfrequenzflag auf 
50 Hz gesetzt. Auch das Ausschalten ist moeglich. Hierbei 
wird der USR-Vektor wieder auf "?ILLEGAL QUANTITY ERROR" ge- 
setzt, der NMI-Vektor erhaelt seinen Normalwert, den er beim 
Einschalten hat. Die Uhr laeuft natuerlich weiter (auch 
durch zum Beispiel Recorderoperationen wird diese nicht an- 
gehalten). Das "Abschalten" erfolgt durch ... 


SYS 49253 


Das Maschinenprogramm hat eine Laenge von 308 Bytes. Hier 
das Listing zum Eingeben ... 


REM "TIME OF DAY" «IRB-CIR> FUER DEN COMMODORE 84 
FOR1=249152T0494593 :RERDA : A=R+% : Y=R-"TV :POKEI.AR:NERT 
IF3<>349B890RY<L>4 1 PTHENPRINT :PRINT"CHECKSUM ERROR 
DATR1693,122,141.17,3,169.192,.141,.12.3.163,.29.141.24.3.153,.192,.141.25,3.172 
DATA14,228,9,128,141,.14,.220, 96.72.138,72,152,72.169.127.141. 13.221.172,13 
DATR221,18,3,76,114.254.32,188,246,32.2253,255.208,243,162,4- 189.47 ,253.157 
DATA19,3,202,203,247,162,26.139,53,253,1597,25.3.202,202,247,1689,127.141.13 
DATR220.141.13,221, 141,,2 >20, 169,135,141, 14,220, 169.8.32, ı 253.76,198.254 


DATA169, 72.141, 17.3.169,178.191,13,3,1689.71.141,.24.3,.169,294.141.29.3.968 


DATA35,13,16.1093,32,130,.183. 192,7,208, 81, 173, 15.220,41,12 7,.141,15.220. 160. 
DATA169,26..32,200,.192 -170,208,.2,169,.36, 2a. 19.144.7.248, 56.233. 12,216.93 
DATR128.141,.11.220,32.138,192.141, 10.220.232, 193,.192,1491,9.220.32,43,.193 
DATA141,8,220. 169.,76. ga,155,1a4,104,.1043.104,.169, 255 ‚208.245 ‚153.96,133. 38 
DATA32.221.192,14,10,10,.10,133.37,32,221.192,53,.37,197 ‚25 ,176..228,96 „177.34 
DATASE.232.48, 144,213, 201 ,.1a,178,.214, 209.96, 159,7,32,123,.18a,184,.17 3.11 
DATA229,8,.41,.31,2401,18,.208,2.169.,49.168,5,.248.24,.105- 32.21, 193. 2 
DATA19,220,.32,31,193,173,.3,.229,.32.31.193,173.8,220,.32 ‚133. 104. 104. 
DATA202,180,72.74,74,74,74,32.42,193,104,431.15,.3,.493, a 35.32, 221 
DATA192,96 


114 


ADAPTION VON CBM-PROGRAMMEN AN DEN COMMODORE 64 


Bei der Adaption von BASIC-Programmen der uebrigen Commodo- 
re-Computer muss eine Unterscheidung gemacht werden, da BA- 
SIC-Programm nicht gleich BASIC-Programm ist. Folgende Un- 
terteilung soll hier gewaehlt werden: 


l. "reine" BASIC-Programme OHNE maschinennahe Befehle vie: 
WAIT, POKE, PEEK, SYS, USR 


2. BASIC-Programme OHNE die Befehle SYS und USR 
3. kombinierte BASIC- und Maschinenprogramme mit SYS und USR 


Programme des Typs 1 sind im Normalfall ohne Einschraenkun- 
gen auf den Commodore 64 uebertragbar. Einige Befehlssequen- 
zen werden sich sogar vereinfachen lassen, speziell bei Pro- 
grammen des PET 2001, da das BASIC in bestimmten Feinheiten 
noch modifiziert wurde. Bei Programmen des CBM 8032 wird das 
Bildschirmformat (auch in Hinsicht der Fensterdefinitionen) 
geaendert werden muessen. Ausserdem duerfen natuerlich keine 
BASIC 4.0-Befehle wie "CATALOG" oder aehnliches vorkommen. 


Die UVebertragung von Programmen des Typs 3 wird im Normal- 
fall nur sehr schwer moeglich sein, speziell wenn auf I/0- 
Bausteine zugegriffen wird. Auch die Strukturen der 05's un- 
terscheiden sich stark von der des Commodore 64. Daher wird 
es meist nur dem versierten Assembler-Programmierer moeglich 
sein, diese Programme zu adaptieren. Benoetigte neue System- 
unterlagen dazu (entsprechend dem ROM-Listing) sind bei uns 
staendig in Entwicklung. Fragen Sie bei Bedarf einfach nach. 


Im folgenden nun Hinweise fuer die Anpassung: 


Das Einladen von Programmen kann einfach durch den LOAD-Be- 
fehl erfolgen. Dies ist trotz der unterschiedlichen Anfangs- 
adresse moeglich, da "LOAD" das Programm an den Anfang des 
BASIC-Bereichs verschiebt. Lediglich bei Cassettenprogram- 
men, die auf dem PET 2001 aufgenommen wurden, muss VOR dem 
Laden "POKE 43, 0" und nach dem Laden "POKE 43, 1" eingege- 
ben werden, da hier das Abspeichern von Programmen ab Adres- 
se 1024 vorgenommen wurde. 


Die meistverwendeten systemspezifischen Befehle des BASICs 
2.0 und 4.0 sollen aufgefuehrt werden: 


Die Befehle "POKE 59468, 14" und "POKE 59468, 12" bewirken 
die Umschaltung zwischen Kleinschrift (14) und Graphik (12). 
Dies erfolgt beim 64er durch "PRINT CHR$ (14)" und "PRINT 
CHR$ (142)". 


In Spielen werden oft die Adressen 151 und 152 verwendet. 
151 enthaelt den Code der gedrueckten Taste, entsprechend 
203 beim Commodore 64. Die Shift-Taste wird statt 152 durch 
653 (zusammen mit Commodore und Control!) festgestellt. Al- 
lerdings enthaelt 151 in dem Falle, dass keine Taste ge- 
drueckt ist nicht den Code 64 sondern vielmehr 255. 


Der Bildschirm ist ein weiterer "kritischer" Bereich. Hier 
muessen Adressen von 32768 bis 33767 (oder bis 34767 beim 
80-Zeichen-Schirm) in den Bereich von 1024 bis 2023 umge- 
rechnet werden. Ausserdem muss die Register der Color-Nybb- 
le-Area belegt werden. Man kann sich die Arbeit jedoch we- 
sentlich vereinfachen, wenn man den Anfang der Video-Matrix 
wie beim VIC-II-Chip beschrieben auf die Adresse 32768 legt. 


115 


Auch die Verwendung des Tastaturpuffers ist gebraeuchlich. 
Dieser belegt bei den CBM's den Bereich von 623 bis 632 
(oder eventuell auch weiter). Dies entspricht den Adressen 
631 bis 640 des Commodore 64. Die Anzahl qgueltiger Zeichen 
wird in Adresse 198 (statt 158 bei den CBM's) festgelegt. 
Die Adresse 158 wird auch mit dem WAIT-Befehl angesprochen. 
Dies dient dem Programmhalt, bis eine Taste gedrueckt wird. 


Das Abschalten der RUNSTOP-Taste wird durch Aendern des In- 
halts von 144 erreicht. Beim BASIC 2.0 erfolgt dies durch 
den Wert 49 (normal 46) und beim BASIC 4.0 durch den Wert 88 
(normal 85). Die entsprechenden Kommandos fuer den 64er sind 
"POKE 788, 52" (Abschalten) sowie "POKE 788, 49" (Einschal- 
ten). 


Weitere Adressbelegungen sind: CBMs 64er 
USR-Vektor 0 - 2 784 - 786 
Anfang des BASIC-Bereichs 40 - 4] 43 - 44 
Anfang der Variablen 42 - 43 45 - 46 
Anfang der Arrays 44 - 45 47 - 48 
Ende der Variablen 46 - 47 49 - 50 
Ende des Arbeitsspeichers 52 - 53 55 - 56 
CHRGET-Routine 112 - 135 115 - 138 
IRQ-Vektor 144 - 145 788 - 789 
Statusvariable ST 150 144 
gedrueckte Taste 151 203 
Flag fuer SHIFT 152 653 
Flag fuer LOAD und VERIFY 157 10 / 147 
Anzahl Zeichen im Tastaturpuffer 158 198 
Flag fuer Negativdarstellung 159 199 
Flag fuer Cursor ein/aus 167 204 
Zeiger auf Anfang der Cursorzeile 196 - 197 209 - 210 
Cursorspalte 198 211 
Flag fuer QUOTE-Modus 205 212 
Cursorzeile 216 214 
Zaehler fuer INSERT 220 216 
Tabelle der MSB's des Bildschirms 224 - 248 217 - 24] 
Flag fuer Kontrolle von Tape #1 249 192 
Flag fuer Kontrolle von Tape #2 250 192 
Tastaturpuffer 623 - 632 631 - 640 
l. Cassettenpuffer 634 - 825 828 - 1019 
2. Cassettenpuffer 826 - 1017 828 - 1019 


116 


SPEICHEFRULUFTEILUHNG DES COrmObüOrRE 


KERNAL- 
ROM- 
BEREICH 
CHARACTER- 
RON- 
BEREICH 


BEREICH 
DER 1.C- 
REGISTER 


65535 
| RANM- 
37344 | BEREICH 
57343 
53248 | BEREICH 
53247 
ei RAN- 
49152 | BEREICH 
49151 

RAM- 
4a98a | BEREICH 


EBRSIC-?> 
RAN- 
BEREICH 
£BASIC-> 
RAM- 
BEREICH 


CRARTRIDGE-— 
ROM- 
BEREICH 
CARTRIOGE— 
ROM- 
BEREICH 


BRSIC- 
ROM- 
BEREICH 


PROZESSOR- 
STRCK 


Ext 
55313 |COLOR-RAN- 


ZEROPRGE- 


PROZESSOR- 
PORT 


117 


Jh 


MEMORY MAP DES COMMODORE 64 


Speicherstellen mit Bezeichnung und dem Zusatz "unbenutzt" 
werden geaendert, aber nicht abgefragt oder benutzt. 


Adresse 
0 : 
1 : 
2 : 
3 - 4: 
5 - 6: 
7 : 
8 
9 : 
10 : 
11 : 
12 
13 : 
14 : 
15 : 
16 : 
17 s 
18 
19 : 
20 - 21: 
22 : 
23 - 24: 
25 - 33: 
34 : 
34 - 35 
36 
36 - 37 
40 B 
40 - 41: 
38 - 4]: 
42 : 
43 - 44; 
45 - 46 
47 - 48 
49 - 50 
51 - 52 
53 - 54 
55 - 56 
57 - + 58 
58 
59 
59 - 60 
6l - 62 


Bedeutung 


Datenrichtungsregister des Prozessorports 
I/0O-Register des Prozessorports 

unbenutzt 

45482, Vektor: FLPINT (unbenutzt) 

45969, Vektor: INTFLP (unbenutzt) 
Suchzeichen/Trennzeichen, 

Ziffer beim Lesen von Zeilennummern, 

Register zur Ausfuehrung von AND und OR 
Suchzeichen/Trennzeichen, 

Flag fuer Anfuehrungszeichen, 

Register zur Ausfuehrung von AND und OR 
Zwischenspeicher fuer Cursorspalte bei TAB 

Flag fuer LOAD (=0) und VERIFY (=1) bei BASIC 
Laenge der einzufuegenden Programmzeile, 
Tabellenzeiger auf BASIC-Worte (Tokenwandlung), 
Ausfuehrung von AND (=0) und OR (=255), 
Anzahl Dimensionen bei Array-Verwaltung 

Flag fuer DIM 

Typ des arithmetischen Ausdrucks 

(String=255, numerisch=0) 

Art der numerischen Variablen 

(Integer=128, real=0) 

Flag fuer DATA (Umwandlung in Tokens), 

Flag fuer Anfuehrungszeichen (LIST), 

Flag fuer GARBAGE COLLECT bei Stringeinbau 
Flag zum Sperren der Annahme von Integer- und 
Feldvariablen (FN und FOR) 

Flag fuer INPUT (=0), GET (=64) und READ (=152) 
Speicher fuer Operatormaske ("(=)"), 
Vorzeichenflag bei trigonometrischen Funktionen 
Flag fuer direkte Eingabe/Ausgabe (=0) oder 
ueber Filekommando (=fFilenummer) 

Zeilennummern und Integervwerte (Adressen) 
Zeiger auf Tabelle der Stringdescriptoren 
Zeiger auf zuletzt benutzten Stringdescriptor 
Tabelle der Stringdescriptoren (String-Stack) 
Zeiger in Arrayheader, 

Zwischenspeicher fuer Operator 
Uebertragungszeiger, Lesen von Zeilennummern, 
Zeiger fuer Speicherverschiebungen, Suchzeiger, 
Variablenzeiger, Stringzeiger, Sprungvektor 
Zwischenspeicher bei NEXT 

Zeiger fuer indirekte Speicherung 

Laenge eines Feldelementeintrags 

Faktor fuer Feldelementberechnung in Array 
Ergebnisbereich der Mantisse ("*" und "/") 
Rundungsstelle bei Division (unbenutzt) 

Zeiger auf Start des BASIC-Programms 

Zeiger auf Start der nichtindizierten Variablen 
Zeiger auf Start der Feldvariablen 

Zeiger auf Ende (plus eins) der Feldvariablen 
Zeiger auf Anfang des Stringbereichs 

Zeiger fuer Stringuebertragungen 

Zeiger auf Ende (plus eins) des BASIC-Speichers 
momentane BASIC-Zeilennummer 

Flag fuer Direktmodus (=255) 

gleich null, falls kein CONT moeglich 
Zeilennummer fuer CONT (bei Abbruch) 
CHRGET-Pointer auf Befehl (bei CONT) 


118 


74 


73 


- 68: 


11% 


Zeilennummer der momentanen DATA-Zeile 

Zeiger auf naechstes Element fuer DATA 

Zeiger auf Eingabequelle zur Auswertung 
(INPUT, GET, READ) 

Variablenname 

Zwischenspeicherung (YR) fuer Tabellenzeiger 
(Stringerzeugung aus Fliesskomma oder Uhrzeit) 
Zeiger auf Variable 

Zwischenspeicher fuer Geraetenummer beim Lesen 
der LOAD/SAVE/VERIFY-Parameter, 
Zwischenspeicher fuer Filenummer beim Lesen der 
Fileparameter fuer OPEN und CLOSE, 
Zwischenspeicher fuer zweiten WAIT-Parameter 
Zwischenspeicher fuer Geraetenummer beim Lesen 
der fileparameter fuer OPEN und CLOSE, 
Zwischenspeicher fuer dritten WAIT-Parameter 
Zeiger auf FOR-NEXT-Variable (fuer Stacksuche), 
Zeiger auf Variable bei Zuweisungen 

(INPUT, GET, LET, READ) 

Zeiger auf Prioritaetsflag in Tabelle, 

Flag fuer fehlenden Operator bei Auswertung 
Zwischenspeicher fuer CHRGET-Pointer 

(INPUT, GET, READ) 

Maske fuer Vergleichsoperationen (Auswertung) 
Function-Variablenzeiger fuer DEF und FN, 
Zeiger in Stringdescriptor bei GARBAGE COLLECT 
Zeiger auf Stringdescriptor bei LEFT$, RIGHT$, 
MID$, LET, Stringaddition und Transfer von 
Strings in den Stringbereich 
Fliesskommaregister (Zwischenspeicherung) 
(Exponent bei Potenzierung) 

Schrittweite fuer GARBAGE COLLECT 

Code 76 fuer "JMP" 

Zwischenspeicher fuer Schrittweite 

(GARBAGE COLLECT), 

Zwischenspeicher der Ruecksprungadresse high 
(MID$) 

Zwischenspeicher fuer Rundungsstelle von FAC 
(Addition und EXP) 

Sprungvektor fuer Funktionen 

Pointer fuer Blocktransfer (Programmzeilen, 
Variablen, Arrays), 

Pointer in Array fuer GARBAGE COLLECT 

Pointer fuer Blocktransfer (Variablen, Arrays, 
Programmzeilen, Strings bei GARBAGE COLLECT) 
Fliesskommaregister (Zwischenspeicherung) 
(Polynomausvertung, TAN) 

Anzahl Stellen fuer TI$, 

Bitzaehler fuer: 16-Bit-Binaermultiplikation, 
Zaehler fuer Anzahl Nachkommastellen (STRFAC), 
Dezimalexponent (FACSTR) 

Flag fuer Exponentialdarstellung (FAULSTR), 
Dezimalexponent (STRFAC), 

Flag fuer Dezimalpunkt (STRFAC) 

Vorzeichen des Exponenten (STRFAC) 

Pointer fuer Blocktransfer, 

Startadresse einer Programmzeile, 

Pointer fuer Verwaltung von Variablen, 

Pointer fuer Stringtransfer (GARBAGE COLLECT) 
Fliesskommaregister (Zwischenspeicherung) 
(Polynomausvertung) 

Exponent von FAC 

Stringdescriptor (Stringlaenge, Stringpointer) 
Argument zu ON (Ergebnis von GETBYT), 
Stringlaenge fuer MID$ 


119 


115 
122 


"139 
144 
145 


114: 


Variablenpointer (Elementauswertung) 
Arrayindex (Feldelementberechnung), 

Mantisse von FAC (MSB bis LSB, 32 Bits) 
Vorzeichen von FAC 

Vorzeichen fuer STRFAC, 

Zaehler fuer Polynomgrad (Polynomauswertung) 
Vorzeichen (Umwandlung FAC in Integerformat) 
Exponent von ARG 

Pointer auf zweiten String fuer Stringvergleich 
Mantisse von ARG (MSB bis LSB, 32 Bits) 
Vorzeichen von ARG 

verknuepftes Vorzeichen von FAC und ARG 

(Flag fuer gleiches Vorzeichen FAC und ARG), 
Rundungsstelle von FAC (fuenftes Mantissenbyte) 
Stringdescriptorzeiger fuer Uebertragung des 
Strings in den Stringbereich, 

Pointer auf Descriptor des ersten Strings 
(Stringaddition) 

Zwischenspeicher fuer Pointer auf codierte 
Zeile (Umwandlung von Text in Tokens), 
Stellenzaehler fuer Zuweisung an T1$, 

Pointer auf erzeugten String (FACSTR) 

Pointer auf Tabelle mit Koeffizienten 
(Polynomausvwertung), 

Pointer fuer Arrayhandling (Elementlaenge, 
Feldlaenge, Positionsberechnung fuer Element), 
Zwischenspeicher fuer CHRGET-Pointer bei VAL, 
Endpointer fuer VUebertragung von Strings in den 
Stringbereich 

CHRGET-Routine, liest Zeichen aus BASIC-Text 
CHRGET-Pointer, zeigt in BASIC-Text; 

wird auch zum Auswerten von Eingaben und 
aehnlichem auf andere Quellen umgesetzt 
(INPUT, GET, READ, FN, VAL) 

letzte Zufallszahl bei RND 

1/0-Statusbyte fuer Cassette und seriellen Bus 
Zwischenspeicher Tastaturausgang fuer RUNSTOP 
und Abfrage der Commodore-Taste bei Tape-Read 


Die Angaben "Read" und "Write" beziehen sich auf die 
Verwendung dieser Adressen bei den Recorderoperation! 


146 


Korrekturflag zur Anpassung der Timing- 
Konstanten bei Gleichlaufschwankungen (Read) 
Flag fuer LOAD (=0) und VERIFY (=1) fuer KERNAL 
Flag fuer "Zeichen gepuffert" bei seriellem Bus 
serielles Register fuer Ausgabe von Daten 
(serieller Bus) 

sovie Puffer fuer letztes Byte (EOI) 

Flag fuer "End of Block empfangen" (Read) 
Zwischenspeicher. fuer Indexregister beim Holen 
von einzelnen Zeichen (GETIN) 

Anzahl an geoeffneten logischen Files 

(Zeiger in Tabelle der Fileparameter) 

aktives Eingabegeraet, normalerweise Tastatur 
aktives Ausgabegeraet, normalerweise Bildschirm 
Register zur Bestimmung des Paritybits von 
Datenbytes (Read/Write) 

Flag fuer "Byte empfangen" (Read) 

Flag fuer Ausgabemodus fuer Betriebssystem- 
meldungen (siehe Beschreibung Systemroutinen), 
Festlegung fuer Direktmodus und Programmodus 


120 


158 


159 


160 
163 


164 


165 


166 
167 


168 


169 


171 


172 


Zwischenspeicher fuer Kennzeichnung des Datei- 
typs, Pointer auf Filenamen bei Uebertragung 
des Filenamens (beides beim Erzeugen des Datei- 
kopfs fuer Tape-Write), 

Zaehler fuer Anzahl Lesefehler mal zwei fuer 
Pointer in Adressentabelle im Stack fuer 
Fehlerkorrektur (Read) 

Pointer auf Filenamen in Dateikopf bei Ueber- 
tragung des Filenamens (Erzeugung des Datei- 
kopfs fuer Tape-Write), 

Korrekturzaehler fuer Pass2 beim Lesen von Band 
(Pointer auf Adressentabelle im Stack, Read) 
interne (softwaremaessig realisierte) Uhr 

(TI, TI$, Reihenfolge MSB bis LSB!) 

EOI-Flag bei Ausgabe auf seriellen Bus, 
Bitzaehler fuer Lesen von Datenbytes (Read) 
serielles Register fuer Empfang von Daten vom 
seriellen Bus, Flag fuer Empfang/Ausgabe beider 
Impulse, die ein Datenbit festlegen, 
Impulszaehlung (Read/Write) 

Zaehler fuer acht Bits bei Ausgabe/Empfang von 


Daten ueber seriellen Bus, Flag fuer EOI (=0) 


und Zeitfehler (=1) bei Timeout (serieller Bus) 
Zaehler fuer Synchronisationsbytes 

(Zaehlung, Write) 

Pointer in Cassettenpuffer fuer Filehandling 
Anzahl noch zu lesende Blocks (Read), 

Zaehler fuer Dauer der Shorts (Write), 
Zwischenspeicher fuer empfangenes Bit (RS-232) 
Flag fuer Lesefehler eines Bits und Parityerror 
(Read), 

Flag fuer "Byte-Impuls geschrieben" (Write), 
Bitzaehler fuer Empfang von Bytes (RS-232) 
Flag fuer Impulslaengenvechsel zur Erkennung 
von Bit-Lesefehlern (Read), 

Flag fuer "Long-Impuls (nach "Byte"-Impuls) 
geschrieben" (Write), 

Flag fuer Empfang des Startbits (RS-232) 

Flag fuer Synchronisationszaehlung (=1 bis 9), 
Abtastung (=0), Lesen (=64) und Ende (=128), 
serielles Shiftregister fuer Empfang von Daten 
(RS-232) 

Register zur Errechnung der Puffer-Pruefsumme 
(Checksum, Read), Laenge des Headers (Write), 
Register zur Errechnung der Parity beim Empfang 
von Daten (RS-232) 

Transportzeiger fuer Tape und SAVE auf seriel- 
lem Bus, Pointer fuer Scrolling (Videomatrix, 
Quellzeile) 

Endadresse fuer Write/SAVE (Programm), Pointer 
fuer Scrolling (Colornybbles, Quellzeile), 
Transportzeiger fuer LOAD*-von Diskette 
Timing-Konstante zur Anpassung der Lese- 
geschwindigkeit, Korrektur durch (146) (Read) 
vergangene Zeit seit letzter negativer Flanke 
(Read) 

Pointer auf Startadresse des Recorderpuffers 
Freigabeflag fuer TimerA (Tape Read), 
BitZaenlelr fuer Ausgabe von Bytes (RS-232) 
Flag fuer "qgueltiges EOB empfangen" (Read), 
naechstes zu sendendes Bit (RS-232) 

Flag fuer Lesefehler des Bytes (Tape Read) 

und Vergleichsfehler (VERIFY); 

Flag fuer "Block geschrieben" (Tape Write), 
serielles Shiftregister zur Ausgabe von Daten 
(RS-232) 


121 


209 


212 
213 
214 
215 


216 
217 


242 


243 


245 


247 
249 
251 


241: 


244: 


246: 


248: 
250: 
254: 


Laenge des Filenamens 

aktuelle logische Filenummer 

aktuelle Sekundaeradresse 

aktuelle Geraetenummer 

Pointer auf Filenamen 

Register fuer gelesenes Byte sowie Checksum 
beim Lesen (letztes gelesenes Byte, Read), 
serielles Bit-Shiftregister (Write), 

Register zur Bestimmung der Parity bei der 
Ausgabe von Daten (RS-232) 

Zaehler fuer Anzahl noch zu verarbeitender 
Blocks (Read), 

Anzahl noch zu schreibende Blocks (Write) 
serielles Shiftregister zum Lesen von Bytes 
(Tape Read) 

Motorkontrolle zum Anhalten des Recordermotors 
Pufferstartadresse, Programmstartadresse 
(SAVE, Tape Read/Write), Pointer fuer RAM-Test 
Startadresse (Appendadresse) bei LOAD (KERNAL), 
Uebertragungszeiger fuer Vektortabelle 
Tastaturmatrixcode aus vorherigem Aufruf der 
Tastaturabfrage (SCNKEY) 

Anzahl qgueltige Zeichen im Tastaturpuffer 

Flag fuer Negativdarstellung (RVS5) 

Pointer auf letztes Zeichen (ungleich Space) in 
Bildschirmzeile beim Lesen der Eingabezeile 
Cursorzeile bei Aufruf von CHRIN, 

Flag fuer Cursorzeilenvechsel bei Eingabe 
Cursorspalte bei Aufruf von CHRIN 
Tastaturmatrixcode aus SCNKEY-Aufruf, 

Pointer in Decodierungstabelle fuer Tastatur 
Flag fuer Cursor ein (=0) und aus 

Zaehler fuer Cursorblinkdauer 

Zeichen unter Cursor, falls Cursor hell 

Flag fuer Cursor hell/dunkel (wenn (204) = 0) 
Flag fuer letztes Zeichen beim Lesen von 
Zeichen vom Bildschirm, Flag fuer "RETURN" 
Pointer auf Anfang der Cursorzeile im 
Bildschirm-RAM, Zielpointer fuer Scroll 
Cursorspalte innerhalb der Cursorzeile, 
Indirect-Pointer zu (209/210) 

Flag fuer Anfuehrungszeichen (Quote-Modus) 
Laenge der aktuellen Cursorzeile (39 oder 79) 
Nummer der Cursorzeile (O0 bis 24) 

Register fuer gelesenes Bit (Tape Read), 
Puffer-Pruefsumme (Tape Write), 
Zwischenspeicher fuer Zeichencode sowohl bei 
Umwandlung von ASCII in Bildschirmcode als 
auch umgekehrt (bei Ausgabe von Zeichen und 
beim Lesen von Zeichen vom Bildschirm) 
Insertzaehler, Anzahl noch ausstehender Inserts 
Tabelle der Doppelzeilenkennzeichnungen, 

Bit O und Bit 1 enthalten die Page# innerhalb 
der Videomatrix; ist Bit 7 geloescht, so 
handelt es sich um eine Fortsetzungszeile 
Einfachzeilenkennzeichnung der "26. Zeile" 
(falls auf Fortsetzungszeile zur letzten Bild- 
schirmzeile zugegriffen wird) 

Pointer auf Anfang der Cursorzeile im 

RAM der Colornybbles, Zielpointer der Farbcodes 
fuer Scroll 

Pointer auf Decodierungstabelle fuer Tastatur- 
abfrage (SCNKEY) 

Zeiger auf Beginn des Empfangspuffers (RS-232) 
Zeiger auf Beginn des Sendepuffers (RS-232) 
unbenutzt 


122 


255 - 271: Puffer fuer Zahlenumwandlungen von Fliesskomma 
in Strings sowie fuer Erzeugung von TI1$ 

256 - 379: Puffer fuer Fehlerkorrektur beim Lesen von Band 
(enthaelt Adressen der fehlerhaften Bytes) 

256 - 511: Hardwarestack des Prozessors, wird ausser der 
normalen Funktion des Stacks auch zur 
Speicherung von Daten fuer GOSUB und 
FOR-NEXT-Schleifen verwendet 


508 - 511: Speicher fuer Zeilennummer und Pseudolink fuer 
Einbau von Programmzeilen in BASIC-Text 
512 - 600: BASIC-Eingabepuffer, wird verwendet fuer INPUT, 


GET (jeweils auch fuer Filehandling), Puffer 
fuer Eingabe von Zeilen, Umwandlung in Tokens 


"601 - 610: Tabelle der Filenummern 
611 - 620: Tabelle der Geraetenummern 
621 - 630: Tabelle der Sekundaeradressen 
631 - 640: Tastaturpuffer 
641 - 642: MEMBOT, Speicherbeginn fuer BASIC 


643 - 644: MEMTOP, Speicherende fuer BASIC 


645 : Timeout-Flag fuer seriellen Bus (unbenutzt) 

646 : Cursorfarbe (Druckfarbe fuer Zeichenausgabe) 

647 : Farbe unter Cursor, falls Cursor hell 

648 : Startpage der Videomatrix 

649 : maximale Groesse des Tastaturpuffers 
(maximale Anzahl Zeichen im Tastaturpuffer) 

650 : Flag fuer REPEAT: 
Bit 7 gesetzt: REPEAT fuer alle Tasten 
Bit 6 gesetzt: REPEAT fuer keine Taste 
sonst nur fuer Cursorsteuerung und SPACE 
Bit 7 hat Prioritaet vor Bit 6 

651 : Zaehler der Wiederholungszeit fuer REPEAT 
(Geschwindigkeit) 

652 : Zahler der Anspruchszeit fuer REPEAT 
(Verzoegerung) 

653 : Flag fuer Kombinationstasten: 


Bit 0: Shift 
Bit 1: Commodore 
Bit 2: Control 
das entsprechende Bit ist gesetzt, wenn die 
Taste gedrueckt ist 

654 : Kopie von (653) fuer Abfrage, ob Commodore- 
und Shift-Taste schon beim letzten Aufruf 
gedrueckt waren (fuer Umschaltung von Graphik 
und Text) 

655 - 656: Sprungvektor fuer Tastaturabfrage 
(kann zum Beispiel verwendet werden, um die 
Funktionstasten zu belegen) 

657 : Flag fuer Blockierung der Umschaltung von Text 
und Graphik durch die Shift- und Commodore- 
Taste (durch CHR$(8) und CHR$(9)) 

658 : Insert Enable, dient zur Erkennung, ob beim 
Ueberschreiten einer Einfachzeile eine 
Leerzeile eingefuegt (Editiermodus) oder die 
Zeile weberschrieben werden soll (Ausgabe von 
Zeichen durch Programm (PRINT)) 


659 : Kontrollregister (RS-232) 

660 : Kommandoregister (RS-232) 

661 - 662: Wert fuer Baud-Rate aus Tabelle (RS-232) 

663 : RS-232 Statusbyte 

664 : Wortlaenge (RS-232) 

665 - 666: Wert fuer Timer beim Senden (RS-232) 

667 : Zeiger auf Ende des Empfangspuffers 

668 : Zeiger auf naechstes Zeichen im RS-232- 
Empfangspuffer 

669 : Zeiger auf zu uwebertragendes Byte im 
Sendepuffer 


123 


670 : Zeiger auf naechste freie Stelle im Sendepuffer 

671 - 672: Zwischenspeicher des IRQ-Vektors waehrend 
Cassettenoperationen 

673 :: Flagregister fuer aktive RS-232-NMIs 

674 : Wert fuer CRA (IRQ-CIA) fuer Neustart von 
Timer A beim Lesen von Cassette 

675 : Wert des Interrupt Flag Registers (Tape Read) 

676 : Flag fuer "Timer A abgelaufen" 
(Underflow, Tape Read) 

677 : Nummer der Fortsetzungszeile beim Erweitern 
einer Einfachzeile (Scroll) 

678 : Flag fuer Quarzfrequenz der verschiedenen 
Versionen des Commodore 64 

679 - 767: unbenutzt 

768 - 1769: 58251, Vektor: Ausgabe von Fehlermeldungen 

770 - 771: 42115, Vektor: Eingabewarteschleife nach READY. 


772 - 773: 42364, Vektor: Umwandlung Klartext in Tokens 
774 - 775: 42778, Vektor: Umwandlung Tokens in Klartext 
716 - 777: 42980, Vektor: Routinenaufruf (Interpreter) 
778 - 779: 44678, Vektor: Elementauswertung (FRMEVL) 


780 : Vebergabevert bei SYS-Befehl (Accu) 

781 : Vebergabevwert bei SYS-Befehl (XR) 

782 : Vebergabevert bei SYS-Befehl (YR) 

783 : Vebergabevwert bei SYS-Befehl (Statusregister) 
784 : Code 76 fuer "JMP" 

785 - 786: 45640, USR-Vektor 

787 unbenutzt 


788 - 789: 59953, IRQ-Vektor 
790 - 791: 65126, BRK-Vektor 
792 - 793: 65095, NMI-Vektor 
794 - 7195: 62282, OPEN-Vektor 
796 - 797: 62097, CLOSE-Vektor 
798 - 799: 61966, CHKIN-Vektor 
800 - 801: 62032, CHKOUT-Vektor 
802 - 803: 62259, CLRCHN-Vektor 
804 - 805: 61783, CHRIN-Vektor 
806 - 807: 61898, CHROUT-Vektor 
808 - 809: 63213, STOP-Vektor 
810 - 811: 61758, GETIN-Vektor 
812 - 813: 62255, CLALL-Vektor 
814 - 815: 65126, unbenutzt 

8l& - 817: 62629, LOAD-Vektor 
818 - 819: 62957, SAVE-Vektor 
820 - 827: unbenutzt 

828 - 1019: Cassettenpuffer 

1020 - 1023: unbenutzt 


Unterschiede in der Speicherbelegung des VIC-20: 


Der USR-Vektor (zusammen mit JMP-Code) belegt die Adressen 0 
bis 2 anstelle der Adressen 784 bis 786, der Prozessorport 
entfaellt. 


Adressen 673 bis 678 sind beim VIC-20 unbenutzt. 
» 


Die Tabelle der Doppelzeilenkennzeichnungen belegt nur den 
Bereich von 217 bis 239 (da nur 23 Bildschirmzeilen). Adres- 
se 240 erfuellt dadurch die Funktion der Adresse 242 des 
Commodore 64. Adresse 24] wird (wie 243 beim Commodore 64) 
beim Loeschen des Bildschirms gesetzt, jedoch in keinem Zu- 
sammenhang damit benutzt. Vermutlich sollte der Speiche- 
rungsbefehl an die Adressen fuer die "24." bzw. "26." Zeile 
gehen, diese werden jedoch schon vorher initialisiert. 
Adresse 242 stand beim VIC-20 noch frei und hat die Funktion 
von (677) des Commodore 64. 


124 


DER PROZESSOR 6510/SPEICHERVERWALTUNG DES COMMODORE 64 


Im Gegensatz zu den vorherigen Computermodellen von Commodo- 
re verfuegt der Commodore 64 nicht ueber eine 6502 als Pro- 
zessor, sondern eine 6510. Auf die Unterschiede und Beson- 
derheiten, die sich daraus ergeben, soll im folgenden einge- 
gangen werden. 


Diese 6510 verfuegt ueber den gleichen Befehlssatz wie die 
6502 auch und ist daher vollkommen softwarekompatibel. Die 
Taktfrequenz betraegt nicht genau ein Megahertz - vie zum 
Beispiel bei den CBMs - sondern etwas weniger (oder bei den 
Geraeten, die fuer die Fernsehnorm NTSC ausgelegt sind, et- 
was mehr) als ein MHz. Die genauen Angaben finden sich bei 
der Erklaerung der Systemroutinen. Der einzige wirkliche Un- 
terschied besteht darin, dass sie zusaetzlich ueber einen 
1/0-Port, bestehend aus sechs Leitungen, veruegt. Jede Lei- 

tung dieses Ports laesst sich getrennt als Eingang oder Aus- 
gang schalten. Dieser Port wird beim Commodore 64 zur Steue- 
rung des Recorders und der Speicherverwaltung verwendet. Das 
besondere an diesem I/O-Port (Prozessorport genannt) ist, 
dass sich Datenrichtungsregister und Ausgaberegister in der 
Zero-Page befinden: 


Adresse O: DATA DIRECTION REGISTER 
Adresse 1: OUTPUT REGISTER 


Diese beiden Speicherstellen stehen daher nicht mehr fuer 
die Datenspeicherung zur Verfuegung (weswegen auch der, USR- 
Vektor verlegt werden musste). Allerdings koennen nun sechs 
Steuerleitungen durch die .Zero-Page-Adressierung erreicht 
werden. Diese Steuerleitungen werden ueber die Bits 0 bis 5 
(Bits 6 und 7 sind als Portleitungen nicht vorhanden) kon- 
trolliert und haben folgende Bedeutungen: : 


Bit O0: (Output) LORAM, Kontrolleitung fuer Speicherbelegung 
Bit 1: (Output) HIRAM, Kontrolleitung fuer Speicherbelegung 
Bit 2: (Output) CHAREN, Ein-/Ausblenden des Zeichengenerator 
Bit 3: (Output) Schreibleitung fuer Recorderoperationen 
Bit 4: (Input) Feststellung, ob Recordertaste gedrueckt ist 
Bit 5: (Output) Ein- und Ausschalten des Recordermotors 


Die Kontrolle ueber die Funktion einer Datenleitung als Ein- 
gang oder Ausgang erfolgt wie in allen anderen Faellen auch: 
Das entsprechende Bit in Adresse 0 (Datenrichtungsregister) 
muss gesetzt werden, wenn diese Portleitung als Ausgang pro- 
grammiert werden soll. Die Funktion als Eingang erhaelt die 
Leitung, wenn das zugehoerige Bit des Datenrichtungsregi- 
sters geloescht ist. Die Umprogrammierung ist jedoch beim 
Commodore 64 meist sinnlos, da der gesamte Prozessorport be- 
reits durch das Betriebssystem und durch die Hardware fest- 
gelegte Funktionen erfuellt. 


Die Bits 3 bis 5 werden fuer Recorderoperationen verwendet. 
Bit 3 dient dazu, Impulse auf Band zu schreiben (siehe ROM- 
Listing, Adresse 64422 ff). Bit 4 ist geloescht, wenn eine 
Recordertaste (ausser REC und STOP) gedrueckt ist, ansonsten 
gesetzt (auch, wenn kein Recorder angeschlossen ist). Bit 5 
dient der Recordermotorkontrolle. Soll der Motor eingeschal- 
tet werden, so muss dieses Bit geloescht werden. Das Anhal- 
ten erfolgt entsprechend durch Setzen von Bit 5. Erfolgt 
dies allerdings bei zugelassenem Interrupt (also zum Bei- 
spiel im Normalfall von BASIC aus), so muss ausserdem Adres- 
se 192 auf einen Wert ungleich null gesetzt werden, da an- 
sonsten bei gedrueckter PLAY-Taste der Recordermotor nicht 
angehalten werden kann. 


125 


Das Speicherverwaltungskonzept des Commodore 64 


Der Commodore 64 verfuegt, was in der Werbung auch gross an- 
gepriesen wird, ueber 64 Kilobytes an RAM, 20 Kilobytes ROM 
und ansonsten auch noch ueber einige Bausteine, die geson- 
derte Funktionen uebernehmen. Nur hat dies alles einen Ha- 
ken, der jedem, der sich schon ein wenig mit der Architektur 
der 65xx CPUs beschaeftigt hat, sofort auffallen muesste: 
ein Prozessor mit einem Adressbus von sechzehn Bits kann nur 
64 Kilobytes adressieren. Egal, wie man es dreht und wendet, 
irgendwo ist etwas zuviel. Und fuer denjenigen, der "nur" in 
reinem BASIC (ohne maschinennahe Befehle wie POKE oder PEEK) 
programmiert, sind dies leider 26 KB, die von den verspro- 
chenen 64 KB fehlen, da beim Einschalten nur 38 KB als frei 
verfuegbar gemeldet werden. Von den 64 KB gehen natuerlich 
erst einmal 2 KB fuer Bildschirm (von 1024 bis 2047) und 
Systemspeicher (von O bis 1023) ab. Ausserdem stehen, wie 
dies aus Speicheruebersichten bekannt ist, noch weitere 4 KB 
im Bereich von 49152 bis 53247 zur Verfuegung, von denen man 
als BASIC-Programmierer zwar selten etwas hat, aber man 
weiss immerhin, dass sie vorhanden sind. Bleiben also 20 KB, 
was genau dem Umfang des uebrigen Speichers entspricht. 
Dieser ist zum Beispiel von zwei Betriebssystem-ROMs zu je B 
KB belegt (auch hier "fehlen" 4 KB an den 20 KB ROM). Die 
restlichen 4 KB des adressierbaren Speicherbereichs (von 
53248 bis 57343) der 6510 wird vom LI/O-Bereich, bei dem 
- vie bisher immer - sehr grosszuegig mit der Adressdecodie- 
rung vorgegangen wurde, sodass saemtliche Register sich 
ueber einige Adressen ansprechen lassen, belegt. 


Die restlichen 20 KB an RAM liegen "parallel" oder "unter" 
dem Bereich, der von 1/0 und ROM eingenommen wird. Fuer 
BASIC-Programme oder Variablen laesst sich dieser Bereich 
normalerweise nicht nutzen, jedoch durchaus fuer zum Bei- 
spiel Daten von hochaufloesenden Graphiken. Das Problem be- 
steht nur darin: Wie erreicht man diesen RAM-Bereich? Dazu 
erst einmal eine kurze Zusammenfassung: 


Die 64 KB an RAM fuellen den gesamten Adressbereich des Pro- 
zessors von DO bis 65535. Da jedoch beim Einschalten des Ge- 
raets BASIC vorhanden sein muss, werden zwei BASIC-ROMs (im 
Bereich von 40960 bis 49151 und 57344 bis 65535) "ueber" das 
RAM gelegt, sodass fuer den Prozessor dieses RAM nicht mehr 
existiert, sondern nur noch der ROM. Ausserdem befinden sich 
im Adressbereich von 53248 bis 57343 die Register von Bau- 
steinen, die fuer die Kommunikation mit der Aussenvelt sor- 
gen. Auch das RAM in diesem Gebiet ist fuer den Prozessor 
nicht vorhanden. Lediglich im Bereich von 2 bis 40959 (sowie 
von 49152 bis 53247) ist RAM benutzbar. 


Es muss jedoch Moeglichkeiten geben, sich diesen Bereich 
nutzbar zu machen. Fuer die Steuerung der Bereichsverteilung 
existieren daher (von einer Anzahl weiterer Leitungen, die 
fuer den Programmierer jedoch nicht erreichbar sind, abgese- 
hen) hauptsaechlich fuenf Kontrolleitungen, die den Spei- 
cheraufbau regeln. Dies sind folgende ... 


LORAM : Bit 0 des Prozessorports 
HIRAM : Bit 1 des Prozessorports 
CHAREN: Bit 2 des Prozessorports 
EXROM : Anschluss 9 des Cartridge Expansion Ports 
GAME : Anschluss 8 des Cartridge Expansion Ports 


126 


Wie ersichtlich, sind nur die ersten drei Leitungen soft- 
varemaessig zu aendern, die letzteren dienen der Kontrolle 
von Einschubmodulen wie BASIC-Erweiterungen sovie Spielen, 
die zum Beispiel fuer den Ultimax (VC-10) gedacht sind. 


Alle fuenf Leitungen sind "active low', sodass ihnen der 
Wert null zur Ausuebung ihrer Funktion zugewiesen werden 
muss (entsprechend gegen Masse gelegt). 


Zuerst soll auf die alleinige Wirkung von LORAM in Form ei- 
nes Beispiels eingegangen werden. LORAM steuert den Bereich 
von 40960 bis 49151. Dieser enthaelt im Normalfall den 
BASIC-ROM. Allerdings ist dieser ROM, wie andere Bereiche 
auch, von RAM "unterlegt". Wird LORAM jetzt durch ... 


POKE 1, PEEK (1) AND 254 


... der Wert null zugewiesen, so wird dieses ROM durch den 
entsprechenden RAM-Bereich ausgetauscht. Somit befindet sich 
nun das BASIC-ROM nicht mehr in dem durch den Prozessor er- 
reichbaren Adressbereich, dafuer ist nun RAM vorhanden. Der 
obige Befehl darf natuerlich nicht einfach so eingegeben 
werden. Schliesslich benoetigt man ja den BASIC-ROM. Wird 
dies trotzdem getan, so saegt man vergleichsweise an dem 
Ast, auf dem man selbst sitzt, da dieser Befehl zu einem Ab- 
sturz des Computers fuehrt, im guenstigsten Fall wird ein 
BASIC-Warmstart ausgefuehrt. 


Nun eine weitere Eigenschaft dieses WUeberlappungsprinzips: 
jegliche SCHREIB-Befehle, die in einen Bereich zielen, in 
dem sich ROM befindet, werden in den fuer den Prozessor 
nicht lesbaren RAM-Bereich "umgelenkt". Wird also ... 


POKE 40960, 255 


... eingegeben, so wird dieser POKE-Befehl nicht an den 
BASIC-ROM weitergeleitet. Dies haette auch wenig Sinn, da 
sich ein ROM ja gerade durch die Eigenschaft auszeichnet, 
seinen Inhalt beizubehalten. Stattdessen wird nun die Adres- 
se 40960 des sich "unter" dem ROM befindlichen RAMs mit dem 
Wert 255 beschrieben. Man kann daher den gesamten RAM-Be- 
reich, "üeber" dem sich ROM befindet (also weitere 16 KB der 
noch fehlenden 20 KB an RAM), aendern, jedoch (noch) nicht 
lesen. Somit hat die folgende Befehlszeile ... 


FOR I = 40960 TO 49151 : POKE I, PEEK (I) : NEXT 


.. durchaus einen Sinn, wenn es auch auf den ersten Blick 
sinnlos erscheint, in eine Adresse den Wert zu schreiben, 
der sich doch sowieso schon darin befindet. Inzwischen. wis-' 
sen Sie jedoch, dass durch diese Befehlszeile der Inhalt des 
BASIC-ROMs, das sich momentan in diesem Bereich befindet, in 
das "darunterliegende" RAM kopiert wird. ROM und RAM dieses 
Bereichs sind nun also identisch (allerdings sollte darauf 
hingewiesen werden, dass gerade im Umgang mit Peripheriebau- 
steinen es vorkommen kann, dass ein Wert in ein Register ge- 
speichert wird, der sich schon darin befindet). Jetzt hin- 
dert uns auch nichts mehr daran, das BASIC-ROM durch das RAM 
auszutauschen. Geben Sie doch nun doch einmal "POKE 1, PEEK 
(1) AND 254" ein. Auch wenn sich scheinbar nichts aendert, 
so ist nun das BASIC-ROM fuer den Prozessor nicht mehr vor- 
handen. Alle Daten, die sonst aus dem BASIC-ROM geholt wver- 
den, alle Programmsequenzen, die normalerweise im BASIC-ROM 
ablaufen, all dies geschieht nun im RAM, das nun ueber den 
BASIC-ROM hinueber gehoben wurde (beim Ausprobieren sollten 
uebrigens eventuelle Erweiterungen entfernt werden). 


127 


Was laesst sich nun damit anfangen? Haben Sie sich noch 
nicht ueberlegt, was man im Betriebssystem alles aendern 
koennte. Geben Sie doch einfach einmal ... 


POKE 41853, 32 


... ein. Das Wort "READY." erscheint ploetzlich ohne den 
Punkt (ueber den Sinn dieser Aenderung kann man natuerlich 
geteilter Meinung sein). Schauen Sie am besten einmal im 
ROM-Listing nach. Es koennen nun deutsche Fehlermeldungen 
kreiert werden, sogar deutsche Befehlsworte sind theoretisch 
moeglich (aber wohl nicht unbedingt sinnvoll). Auch das Pro- 
gramm fuer die Abfrage der Echtzeituhr (siehe Beschreibung 
der CIA, Time of Day) kann in den Bereich fuer BASIC direkt 
hineingeschrieben werden. Allerdings sollten nicht solche 
Teile geaendert werden, die waehrend des Aenderungsvorgangs 
aufgerufen werden. Dazu sollte man erst zurueckschalten 
(auch durch RUNSTOP/RESTORE moeglich). 


Beim Commodore 64 existieren nun noch weitere drei Bereiche, 
die verschiedene Inhalte haben koennen, je nach Zustand der 
Kontrolleitungen. Dies sind folgende: 


Der Bereich von 57344 bis 65535 enthaelt im Normalfall den 
KERNAL-ROM (dient zur Bearbeitung von hardwareabhaengigen 
Dingen). Die zweite Moeglichkeit fuer diesen Bereich ist die 
Belegung dieses Bereichs mit RAM. 


Der zweite aenderbare Bereich ist der von 53248 bis 57343. 
Hier existieren gar drei Moeglichkeiten. Zuerst ist dies die 
Verwendung dieses Bereichs als I/O-Bereich. Hier befinden 
sich die Register der CIAs, des VIC-II-Chips und des Sound- 
bausteins. Die zweite Moeglichkeit besteht im Einblenden des 
Zeichengenerators, was Ihnen vielleicht aus dem Kapitel der 
Zeichendefinierung noch bekannt ist. Der Zeichengenerator, 
normalerweise fuer den Prozessor nicht erreichbar, kann den 
1/0-Bereich ersetzen und dann (fuer Aenderungen) ausgelesen 
verden. Als letzte Moeglichkeit existiert natuerlich auch 
hier die der Belegung dieses Bereichs mit RAM. 


Zum dritten Bereich muss nicht viel gesagt werden. Es ist 
der Adressbereich von 40960 bis 49151, der zuvor als Bei- 
spiel diente. Er enthaelt entweder den BASIC-ROM, natuerlich 
RAM oder auch den Inhalt eines Cartridges, das in den Erwei- 
terungsport gesteckt wurde. 


Ausserdem existiert noch der Bereich von 32768 bis 40959: Er 
enthaelt, wenn kein Erweiterungsmodul gesteckt wurde, RAM, 
das von BASIC aus verwendet werden kann. Ausserdem kann es 
den Inhalt eines Cartridge-R0OMs enthalten (zum Beispiel 
EXBASIC), wodurch aber acht Kilobytes an RAM nicht mehr ver- 
fuegbar sind. 


Nun eine genau Uebersicht, welche Leitungen welche Zustaende 
einnehmen muessen, um eine gewuenschte Speicherbelegung zu 
erreichen (nicht alle theoretisch moeglichen Kombinationen 
sind auch erreichbar). Die Leitung CHAREN wird hier ausser 
acht gelassen, sie wird anschliessend erlaeutert. 


>7344-65535: RAM : HIRAM 
KERNAL: HIRAM 


0 
l 


Soll also der Bereich der oberen B KB mit RAM belegt sein, 
so loeschen Sie einfach Bit ] des Prozessorports. Entspre- 
chend setzen Sie Bit 1], wenn das KERNAL-ROM erreichbar sein 
soll. 


128 


53248-57343: RAM : LORAM = O und HIRAM = 0 
1/0 : LORAM = 1] oder HIRAM = 1 


Ist also im Bereich von 57344 bis 65535 KERNAL ausgewaehlt 
worden, so kann hier nicht RAM erreicht werden, da hierzu 
sowohl LORAM, als auch HIRAM geloescht sein muessen, was 
aber nicht moeglich ist, da ansonsten im obigen Bereich 
KERNAL nicht sichtbar waere. Im folgenden Bereich wird es 
etwas komplizierter: 


40960-49151: RAM : HIRAM = O0 oder 
(HIRAM = 1 und LORAM = DO) 
BASIC : LORAM = und HIRAM = 1 und GAME 


1 l 
MODUL : HIRAM l und GAME = O0 und EXROM 


0 


Auch hier ergibt sich zum Beispiel die Einschraenkung, dass 
kein BASIC verfuegbar sein kann, wenn nicht zusaetzlich im 
oberen Bereich KERNAL verfuegbar ist (umgekehrt ist dies je- 
doch durchaus moeglich und sinnvoll). 


32768-40959: RAM : HIRAM = O0 oder LORAM = O oder 
(saemtliche vier Leitungen gesetzt) 
MODUL : HIRAM = 1 und LORAM = 1 und EXROM = OD 


Zusaetzlich existiert noch die Kombination "GAME = 0 und 
EXROM = 1" (restliche Leitungen bleiben unbeachtet), die 
verwendet wird, wenn Module fuer den ULTIMAX auf dem Commo- 
dore 64 ablaufen sollen. Von dieser Kombination wird hier 
jedoch abgesehen. 


Anhand der obigen Angaben sollen nun die Leitungszustaende 
fuer eine gegebene Speicheraufteilung erarbeitet werden: 
KERNAL soll verfuegbar sein, ebenso der normale I/O-Bereich. 
Allerdings soll das gesamte Gebiet von 32768 bis 49151 durch 
ein im Cartridge vorhandenes ROM belegt sein. Die Vorgehens- 
weise: 


HIRAM muss gesetzt werden, da KERNAL verfuegbar sein soll. 
1/0 ist automatisch auch verfuegbar, wenn HIRAM gesetzt ist. 
LORAM ist daher (bisher) beliebig setzbar. Zusaetzlich mues- 
sen nun auch noch GAME und EXROM geloescht sein, da HIRAM = 
l, GAME = DO und EXROM = O0 sein muessen, um im Bereich von 
40960 bis 49151 ein Cartridge einzublenden. Um nun auch im 
darunterliegenden Bereich auf den Modulinhalt zugreifen zu 
koennen, muss also noch LORAM gesetzt werden. Die endguelti- 
ge Verteilung ist also ... 


LORAM = 1], HIRAM = ], GAME = 0, EXROM = O0 


Genauso muss bei anderen Speicherverteilungen vorgegangen 
werden. Sollten notwendige Bedingungen fuer diese Aufteilun- 
gen sich widersprechen (zum Beispiel die Bedingung CARTRIDGE 
in einem Bereich und RAM im Bereich von 57344 bis 65535), so 
ist diese Kombination nicht moeglich und wohl auch in den 
meisten Faellen nicht sinnvoll. 


Nun zur Bedeutung der Leitung CHAREN: Sie tauscht den Zei- 
chengenerator (das sind uebrigens die vorhin noch als "feh- 
lend" bezeichneten 4 KB der 20 KB ROM) gegen den 1/0-Bereich 
aus. Soll der Zeichengenerator also ausgelesen werden, so 
muss dieses Bit geloescht werden. Die genaue Vorgehensveise 
ist bei der Definition eigener Zeichen (Video Interface 
Chip) dargelegt. Befindet sich momentan in diesem Bereich 
kein 1/0, sondern RAM, so kann der Zeichengenerator NICHT 
ausgelesen werden, da dieser nur gegen 1/0, nicht aber gegen 
RAM ausgetauscht werden kann. 


129 


Um nun mit dem gesamten RAM arbeiten zu koennen, muss also 
sowohl darauf schreibend, als auch lesend zugegriffen werden 
koennen. Schreibend ist dies, sofern das RAM mit ROM wueber- 
legt ist, durch POKE (oder durch die Aequivalente der 
Maschinensprache) moeglich. Nur das Lesen kann nicht auf 
diese Weise erfolgen. Es bietet sich also an, eine Art PEEK 
Befehl, der nur auf RAM wirkt, zu konstruieren. 


Dies ist durch Verwendung der USR-Funktion problemlos moeg- 
lich: Zuerst das Maschinenprogramm (als Bereich wurde hier 
der Cassettenpuffer gewaehlt) mit den Erlaeuterungen (siehe 
auch ROM-Listing von 47117 bis 47139): 


828 LDA 2] (20/21) fuer weitere Verwendungen auf 
830 PHA den Stack retten (POKE und WAIT) 
831 LDA 20 

833 PHA 

834 JISR 47095 > GETADR wertet Argument zu USR aus 
837 LDA 1 Inhalt des Prozessorports 

839 PHA auf Stack legen 

840 AND #252 Bits O (LORAM) und 1 (HIRAM) loeschen 
842 SEI Interrupt verhindern (!!!) 

843 STA 1 neue Speicherverteilung festsetzen 
845 LDY #0 

847 LDA (20),Y Zeichen aus RAM lesen 

849 TAY und ins YR uebertragen 

850 PLA vorherigen Inhalt des 

851 STA 1 Prozessorports wiederherstellen 

853 CLI Interrupts wieder zulassen 

854 PLA 

855 STA ‚20 

857 PLA Pointer in (20/21) wiederherstellen 
858 STA 21 

860 JMP 45986 >) Accu := 0, INTFLP 


Nun kann durch USR jede Adresse der 64 KB RAM gelesen wer- 
den, und das von BASIC aus. So kann zum Beispiel eine hoch- 
aufloesende Graphik (bei deren Erstellung ja, vie zum Bei- 
spiel die Sinuskurve bei der £Erklaerung des VIC-II-Chips, 
auch lesend auf den Bit-Map-Bereich zugegriffen werden muss) 
der Speicherbereich unter den Betriebssystem-ROMs verwendet 
werden, der ansonsten fuer BASIC brachliegt. 


Und hier der zugehoerige BASIC-Loader: 


100 DATA 165, 21, 72, 165, 20, 72, 32, 247, 183, 165, 1, 72 
110 DATA 4l, 252, 120, 133, 1, 160, , 177, 20, 168, 104, 133 
120 DATA 1, 88, 104, 133, 20, 104, 133, 21, 76, 162, 179 

130 FOR I = 828 TO 862 : READ A : POKE I, A : NEXT 

140 POKE 785, 60 : POKE 786, 3 


Um die Sinuskurve aus der Erklaerung des Video-Chips nun im 
Bereich der hinteren acht Kilobytes abzulegen, muss zuerst 
obiges Programm eingegeben und gestartet werden. Danach kann 
es durch "NEW" geloescht werden, da sich das Maschinenpro- 
gramm im Bereich von 828 bis 862 befindet. Geben Sie dann 
folgendes Programm ein: 


130 


200 
210 
220 
230 
240 
250 
260 
270 
280 
290 
300 


POKE 56576, 
FOR I = 
FOR I = 
POKE 53272, 
POKE 53265, 
FOR X = 
B =: 
POKE B, 

GET G$ : 
POKE 56576, 
POKE 53272, 


57344 TO 
50176 TO 


0 T0 319 : Y= 
57344 + (X AND 504) + 40 * (Y AND 248) + (Y AND 7) 
uUSR (B) OR 2 $ (7 - 

IF 6$ = 


PEEK (56576) 14 
65535 : 
51175 : 
(53272) OR 8 
(53265) OR 32 


100 - 100 * SIN (X * pi / 160) 


AND 252 POKE 53280, 
POKE I, 0 : NEXT 
POKE I, 1 NEXT 
PEEK 
PEEK 


(X AND 7)) : NEXT 


"" GOTO 280 
PEEK (56576) OR 3 : 


PEEK (53272) AND 247 


PRINT CHR$ (147) 


PINBELEGUNG DER CPU 6510: 


Pin 1 : PHO IN, Eingang des Systemtakts (um ein MHz) 

Pin 2 : RDY, Ready-Leitung (dient im Zusammenhang mit 
dem Anhalten des Prozessor, liegt RDY auf eins, 
so stoppt der Prozessor im naechsten 
Lesezyklus) 

Pin 3 : IRQ/, Interrupt-Eingang des Prozessors, dient 
zum Ausloesen eines Interrupts zum Beispiel 
durch die CIAs oder den VIC-II-Chip 

Pin 4 : NMI/, Eingang zum Ausloesen des nichtmaskier- 
baren Interrupts 

Pin 5 : AEC/, Address Enable Control, bringt Prozessor- 
bus in hochohmigen Zustand und laesst dadurch 
den Zugriff anderer Bausteine auf den Bus zu, 
zum Beispiel durch den VIC-II-Chip) 

Pin 6 : VEC, Versorgungsspannung von +5 Volt 

Pin 7 20: AO bis Al3, Adressbus des Prozessors 

Pin 21 : GND, Masseleitung 

Pin 22 23: Al4 und Al5, Adressbus des Prozessors 

Pin 24 29: P5 bis PO, Prozessorportleitungen 

Pin 30 37: DB7 bis DBO, Datenbus des Prozessors 

Pin 38 : R/W, Schreib/Leseleitung zum Zugriff auf Bus 

Pin 39 : PH2 OUT, zweiter Systemtakt zur Steuerung 
anderer Bausteine 

Pin 40 : RES/, Reset-Leitung dient zur Startinitialisie- 


rung des Systems, bei Uebergang von 0 
(Ruhezustand) nach 1 wird RESET-Vorgang 
begonnen. 


FIH CONFIGURATICN 
FHa IN — l 2 4a RES 
RCı'r z 39 PH2 QUT 
IRQ 3 38 Rh 
NFII 4 Ir al=Tı, 
AEG S 36 o&1 
“WEL 5 >53] _ JDBE 
Aa v 34 DE? 
ri = 33 DB4 
Az 3 32 DES 
Bl 35 DBF 
AST j12 23 Fa 
As 13 2& Fi 
Arie 27 S2 
Mellıs 2 F3 
erte 25 r4 
art: I? 24 PS 
All jıs 23 ALS 
HI2I 19 22 Als 
2] 2-2 aus Co GH! 


(Er 5:4 PRAHS>SIcCcC 


8968 143 227 


48962 


9964 


123 


57 


2ev 


65 


53268 
38235 


Yv 


&6& 


zz 


+55 


Sprunsvektor fuer BASIC-Kaltstart CBASIC-RESET) 
Sprungvektor fuer BASIC-Warmstart, wird kei NMI 


ner 


torindex und Stack ruecksetzen- 


wendet ı 


CLRCHN,. Descrip- 


sperren. 


Tastatur aktivieren, 
"CONT” 


"RERDY.". Eingakewuarteschleife)> 


85 


“‘ertortskelle der BASIC-Befehle 


Jie folgenden Adressen kis einschliesslich 
zeleat und durch das RTS der CHRGET aufgerufen. 


a7 "CBMBASIC" 


’"NEN” werden ak 43001 auf den Stack 


Die Routinen kesainnen daher 


zeeseils an der naechsthcaeheren Adresse. 


33972 
sa974 
3397E 
33978 
3393a 
32932 
14984 
SA93E 
+4933 
R99a 
498992 
499934 
4399385 
32998 
1900 
s1002 
41004 
s1a0& 
31098 
31910 
1012 
31014 
41@16 
41018 
1920 
31022 
411924 
s10285 
41928 
41934 
41032 
41034 
310936 
41933 
31940 


45 
te) 
293 
247 
164 
190 
128 
ker 
184 
159 
112 
323 
28 
134 
2a9 
38 


153 
187 
173 
168 
171 
171 
176 
172 
1693 
163 
1683 
169 
153 
168 
1683 
169 
163 
1693 
194 
225 
223 
223 
1723 


134 


1va 
170 
183 
16&& 
16E 
170 
223 
225 
225 
171 
i6S& 


43056 
42317 
44317 
43255 
43940 
43966 
45194 
44037 
43428 
43167 
43120 
4333 
43036 
431393 
43217 
43322 
43954 
43333 
47148 
Sr r783 
57695 
SYr’eag 
45002 
47137 
43647 
436572 
43094 
42631 
42539 
43653 
Sr64l 
37799 
57798 
43398 
42561 


128 
129 
138 
131 
132 
133 
134 
135 
136 
137 
138 
137 
140 
141 
142 
143 
144 
145 
146 
147 
148 
149 
1508 
151 
152 
153 
154 
155 
156 
157 
158 
1597 
180 
161 
162 


END 
FOR 
NE=#T 
DATA 
INPUT# 
INPUT 
Dim 
READ 
LET 
GOTO 
RUN 

IF 
RE=TORE 
GOSUB 
RETURN 
REM 
STOP 
ON 
HALT 
LOAD 
SAVE 
VERIF'Tr 
DEF 
POKE 
PRINT# 
PRINT 
LONT 
LIST 
CLR 
CMP 
SYS 
OPEN 
CLOSE 
GET 
NEW 


133 


Vektortakbelle der BASIC-Funktionen 


Die Adressen der Funktiorner werden ak 459814 nach (S3786) gekracht und denn durch 
JSR 84 “in 84 steht der Code fuer IMP> aufserutfen. 


41042 57 188 43185 184 SGN 
41844 2084 188 43332 151 INT 
41046 88 158 43216 182 ABS 
41043 16 3 r94 183 USR 
4105q 125 179 45949 184 FRE 
41052 158 179 435982 185 POS 
41954 113 191 499049 1SE& SOR 
41055 151 224 57493 187 RNOD 
410593 234 1893 47394 188 LOG 
41064 237 191 49133 1893 E<P 
41062 100 226 37956 19a COS 
41964 107 226 537963 191 SIN 
41066 180 226 ssa36 192 TAN 
41068 14 227 58126 133 ATN 
4a1a7a 13 194 47117 194 PEEK 
41972 124 183 46972 193 LEN 
41074 191 184 46181 196 STR$ 
41076 173 183 47021 197 YAL 
41978 139 183 46987 193. RSC 
410508 236 182 46828 1939 CHRS$ 
41082 a 193 46949 zen LEFT$ 
410384 44 183 46392 281 RIGHT$ 
4190986 55 183 46903 2202 MIDS 


Tabelle der Pricritsetsflaas und Adressen fuer die Formelsuswer tung 


Die folgende Takelle enthaelt fuer die angegebenen Funktionen Jeweils ein 
Prioritsetsfl39 und die Stsartadresse. Die Adresse wird ab 44576 zuf den Stack 
skgelegt und durch RTS aufgerufen. Die Routinen keyinnen dsher also jeweils ar. 
der naechsthoeheren Adresse. 


41088 121 105 194 121 ar7209 ıiva + 
410891 121 82 194 121 47186 171 - 
410994 123 42 196 123 476558 ir2 * 
41097 123 17 197 123 47989 173 
41184 127 122 191 127 49918 174 Tr 
41193 30 232 175 sa 45932 175 RAND 
aı1las va 229 175 ra 45929 176 OR 


41199 125 179 191 125 49075 Yorzeichenwechsel 
41112 99 211 174 9a 44735 168 NOT 
41115 1900 21 176 109 45077 177 > 173 = 179 < 


134 


C- EN 54 BASIC zZ - - - - - - +1113 


Takelle der BRSIC-Befehlsworte fuer Tokenumwandlung und LIST 


411138 69 78 196 END 
41121 78 79 218 FOR 
41124 78 69 88 212 NEXT 
41128 6863 65 84 193 DATA 
41132 73 78 sa 985 94 163 INPUT# 
41138 73 7 sa S5 212 ‚INPUT 
41143 65 73 205 Dın 
a11l46 82 659 65 196 RERD 
411508 T& 69 212 LET 
41153 71 79 34 207 GOTO 
41157 982 85 206 RUN 
4ai1lsda 73 198 IF 
41162 82 89 83 94 73 82 197 RESTORE 
41169 7’ıi 73 833 935 194 GOSUB 
4i174 S2 69 984 85 82 286 RETURN 
411lsa 982 69 205 | REM 
41183 83 94 7? 288 STOP 
41187 79 206 ON 
41189 87 65 73 212 HRAIT 
41193 vVä 79 653 196 LOAD 
41127 83 65 936 197 SRYE 
a1201 986 69 S2 73 7a 217 VERIFY 
41207 68 659 193 DEF 
41218 Sa 79 75197 FOKE 
aı214 Sa S2 73 73 84 163 PRINT# 
41220 Sa S2 73 78 212 PRINT 
41225 867 79 78 212 CONT 
41229 v6 73 83 212 LIST 
41233 67 76 21a CLR 
41236 67 77 196 CMO 
41239 533 8997 211 SYS 
41242 79 8a 69 206 OPEN 
41246 67 76 79 83 197 CLOSE 
41251 v1 69 212 GET 
41254 738 69 215 NEN 


135 


CM S:4+4 BRSIC Vz - - - - - - +15” 


Tabelle der BASIC-Befehlsworte fuer Taekenumuandlung und LIST (Fortsetzung) 


41257 84 865 66 168 TAB: 
41261 984 207 TO 
41263 7O 206 FH 
41265 83 8a 67 168 SPC« 
41269 94 72 69 26 THEN 
41273 78 79 212 NOT 
41276 83 94 69 208 STEP 
41280 171 + 


41281 173 


41282 17a % 
41283 175 > 
41284 222 t 
41285 65 73 19 AND 
41288 79 zıa OR 
4129@ 190 > 
41291 189 . 
41292 188 < 
412933 83 71 206 SGN 
412968 73 78 212 INT 
41299 85.66 211 ABS 
413Qa2 85 83 21a USR 
41ı2a5 7a 82 197 FRE 
aızas sa 79 211 POS 
41311 83 Sı 210 SOR 
41314 82 78 19€ RHO 
41317 76 79 199 LOG 
413208 69 88 208 ExF 
41323 67 79 211 cos 
41326 83 72 206 SIN 
41329 84 65 206 TAN 
41332 65 934 206 ATN 
41335 sa 69 69 203 PEEK 
41339 76 69 206 LEN 
41342 83 84 82 184 STR$ 
41346 86 65 204 AL 
41349 65 83 195 ASC 
41352 67 72 32 184 CHR& 
41356 76 53 7a 9a 1654 LEFT$ 
a1361 82 73 Tı 72 984 164 RIGHT$ 
41367 77 73 68 164 MIO 
41371 7ı 2a7 Go 
41373 a Trenncode 


136 


cBn S4+4 ERSIcC WW 


3A5IC-Fehlermeldunaen 


1374 
213838 
1397 
1418 
1424 
+1435 
21442 
1456 
11467 
41471 
21434 
11483 
41496 
+1509 
1522 
21525 
1531 
+1533 
1591 
41562 
1562 
431578 
31586 
1599 
31607 
41616 
21629 
411542 
1634 
21658 
sie’ 
21685 
21696 
117008 
1709 
1721 


1728 


1742 
1750 
41759 
1764 


? 


NO NAT NT 


21a 


32 
89 


216 


32 


765 
a4 
9 
32 
53 
593 
66 
58 
9 


’& 
"23 


32 


65 
55 
216 
57 
== 
9 


85 


137 


32 


r8 


21a 


194 


gr’ 212 


85 197 


- +12374 


TOO MANY FILES 
FILE OPEN 
FILE NOT OPEN 
FILE NOT FOUND 
DEVICE NOT 
PRESENT 

NCT INPUT FILE 
NOT OUTPUT 
FILE 

MISSING FILE 
NAME 

ILLEGAL 

DEVICE NUMBER 
NEXT WITHOUT 
FOR 

SYNTAX 

RETURN 
WITHOUT GOSUB 
OUT GF DATA 
ILLEGAL 
QUANTIT'Y 
OVERFLOU 

GUT OF MEMOR'Y 
UNDEF”’D 
STATEMENT. 

BAD SUBSCRIPT 
REDIM’D ARRAY 
DIVISION BY 
ZERO 

ILLEGAL DIRECT 
TrPE MISMATCH 
STRING TOO 
LONG 

FILE DATA 
FORMULA TOO 


COMPLEX» 


CAN’”T CONTINUE 
UNDEF ’D 
FUNCTION 
VERIF'Y 

LORD 


cCcEMN &4+ BASIC vVz a e z 


Startadressen der BASIC-Fehlermeldurgser 


41768 
417708 
41772 
a1774 
41776 
4177 

41780 
41732 
41784 
41798 
41788 
41798 
41792 
41794 
41796 
41798 
41500 
41802 
418304 
41S06& 
41308 
41810 
41912 
41814 
41816 
41818 
41820 
41822 
41924 
419326 


158 
172 
181 


161 
161 
161 
161 
161 
161 
161 
161 
162 
162 
162 
162 
162 
162 
162 
162 
162 
162 
162 
162 
182 
162 
162 
162 
162 
1683 
163 
163 
163 
163 


41374 
41383 
41397 
41418 
41424 
41442 
41456 
41471 
414838 
41509 
41325 
41531 
41951 
41562 
415373 
41586 
415939 
41616 
41829 
41642 
41653 
41672 
4165985 
41700 
41709 
41728 
41742 
41758 
41764 
41859 


weitere Meldungen 


419828 
41333 
41941 
41946 
41357 
41865 


9 
32 


„Ss 13 
89 92 
‚SS >32 
82 69 
66 82 


DO NAIMNNLWmM- 


- TOO MANY FILES 

- FILE OPEN 

- FILE HOT GPEN 

- FILE NOT FÜLIND 

- DEYICE NOT FRESENT 
- NOT INPUT FILE 

- NOT QUTPUT FILE 

- MISSING FILE NANE 

- ILLEGAL DEYICE HUMBER 
- NEXT WITHOUT FOR 

- SYNTAX 

-— RETURN WITHÜLT GOSUB 
- QUT GF DATA 

- ILLEGAL QUANTITY 

- QVERFLOU 

- QLUT OF MEMORY 

-— UNDEF"D STATEMENT 

- BAD SUBSCRIPT 

-— REDINM’D ARRAY 

- DIYISION BY ZERO 

- ILLEGAL DIRECT 

- TYPE MISMATCH 

- STRING TOQ LONG 

- FILE DATA 

- FORNMULA TOO COMFLEX 
- CAN”T CONTINUE 

- UNDEF’D FUNCTION 

- VERIFY 

-— LORD 

- BRERAK 


68 89 46 13 14 5 
65 75 8 


138 


CE &4I+ BRSIC zZ - - - - - - 4195 


Stack-Suchroutine fuer ”’FOR’. ’NEXKT’” und "RETURN” 


41866 TS% Bei den naechsten „vier Bytegs im Stack handelt 
41867 INA es sich um zwei Ruecksprunssdressen \“Ruescksprung 
4193658 INH in Interpreterschleife und Rueckzsprung zur 

419659 IHx aufrufenden Routine? 

4a187a INA 

413871 LDRA 237,8 Ist nsechstes Stackbyvte identisch mit 

41374 CHMP #129 FOR’ -Code? 

41876 ENE 41911 Neinsı Schleife nicht gefunden, RTS 

41378 LDA v4 Ist FOR-NEXST-Yarisklenpointer hish = 97 Cugal. 44320) 
a1290 BHE 418392 keine Yariablenangake kei NEXT> Neins weiter kei 41892 
41882 LOA 258,8 Yarisklenepointer der innersten Schleife 

41835 STA 73 aus dem Stack nach (73774? kringen 

41337 LDR 259 ,% 

41394 STA rq 

41832 CP 259.5 LP’) mit Yarisklenpcinter im Stack vergleichen 
413935 EHE 41904 Ungleichs nasechste Schleife suchen 

41397 LORA 3 

41399 CHP 258 .X% 

41392 BER 41311 Gleich: Schleife sefunden, RTS 

419394 TXA 2 

41905 CLE Suchzeiger um 18 

4190& ARDC #13 “Anzahl Bytes je FOR-NEXT-Schleite)> erhoehen 
41903 TAX 

41709 BNE 41871 Unbkedingter Sprung zum Schei fenkegsinn 

41911 RTS 


Rufkzuı der Datenssaetze „on FÖOÖR-NHEXT und GOSUR im Stack 


ee rn he A IE GE GE GERD [Rob (de Ge Sud auiie GR Auen Amin GERD GIEE AED ale AHEED (END> antun Gate GENE JEHEe GEND GEEER GEHE AANED mu Anz Anget, Gm AUDED Himm AbrAEr Arsen Ai aypmmm Gmmms dumm HAND OAfEm GEED AEDEm GENEm Anm Göm AEES Ammm Cup aan 


J FOR-NEXT l GOSUB ) 
ı A Schleifenstartadresse low I a CHRGET-Pcointer high l 
ı1ı hiahi 1 low 1 
I 2 Zeilernummer hishi 2 Zeilennummer hioh I 
ı 3 lau 13 lom } 
ig TQO-Wert LSB 4 GOSUB-Code 141 l 
= l--- --- - - --- -- - Sn anmanannnnn 
=: l 
ı 7 NSB, Yorzeichen 
153 Exponent L 
I 9 STEP-Wert Vorzeichen ) 
ma LSB l 
si | 
1 l 
113 MSB ) 
114 Exponent | 
115 Yariabklenpointer higahl 
118 low 1 


pn Gun Gun cum sun GR An dem sim ai ariiD Gin ME dan cmme> GERD Ammme sumun AD Guie SEEEn CEEE GEN Au SAEp (Een GEEm Gun Gum Aue GE. 


u rm muup zn Gen Sun en Ges Gen ORze GEmD GERD Gum Are GumD auiD SED FEED Gent main GEEED SEERD aufle (ERS ailEE Guiin Au Cum Cm GER 


139 


CE 5:4 BRSIcC ZZ - - - - = - 


Block-YVerschiebe-Routine 


Einbau von Preoursmmzeilen und Yerschieken “an Arravs 


Eingabe: 


41312 
41915 
41917 
41919 
41920 
41922 
41924 
41926 
41927 
41929 
41931 
41932 
41933 
41934 
41336 
41938 
41933 
41941 
41943 
41945 
41947 
41348 
41950 
41952 
41954 
41956 
413583 


419608 
41962 
41964 
41965 
41967 
419693 
41971 
41973 
41975 
41976 
41978 


Test, 


41979 
41988 
41982 
41984 
41986 
419837 
4193893 
41991 


SR 
STR 
ST'r 
SEC 
LDR 
SBC 
STR 
TAY 
LDA 
SBC 
TA% 
IN* 
TrA 
BEQ 
LOA 
SEC 
SBC 
sSTA 
BCS 
DEC 
SEC 
LODR 
SBC 
sta 
BCS 
DEC 
BCC 


LDA 
sSTA 
DE'Y 
BNE 
LDRA 
STA 


.DEC 


DEC 
DEX 
BNE 
RTS 


ob senug Platz im Stack 


ASL 
ADC 
BCS 
sTtA 
TS% 
CPX 
BCC 
RTS 


Quellbereich: 


eielbereich: 


34 
98 
41948 
1 


83 
34 
S8 
41964 
s9 
41964 


985 ,Y 
3537 ,Y 


41968 


90) ,„Y 
385 .Y 


si 
39 


41964 


#62 
42037 
34 


34 
42037 


19596) 
«9a.91> 
89789) zauie 


Sstartadresse: 
Endadresse+l: 


Endadresse+1: Accu VYR > 


> Pruefunga, ck genug Freier Platz im Speicher 
Accu TR) als neue Startadresse 

fuer freien Speicherplatz speichern 
Startadresse von der Endadresse des 
Quellbereich subktrahieren 

ersibt Laenge des Quellklack Tom 

Ebenso Bvrtes hiah suktrahieren, 

ergikt Zaehler der vallen 256-Evrte-Akschnitte 
Ist ein Restaskschnitt vorhanden” 

Nein: nur sganze Pages verschieben 


Endadresse+1l des Quellkereichs 


minus Lasenge des Restskschnitts 
ergibt Raresse des Restskschnitts 


Endadresse+1l des Zielbereichs 
minus Laenge des Restakschnitts 
ergikt Adresse des neuen Restskschnitts 


Inkedingyter Sprung 


Transtfer-Schleife fuer Restakschnritt 


Transfer-Schleife fuer ganze Pages 


Zaehler fuer gyarze Pages vermindern 


ARecu ı= 2 % Accu 
+ 682 
Ist Accu keim Rufruf > 96 


oder ist der Stackpointer 


<2 %* (Accu) + 82? 
Jas "OUT OF MEMORY ERROR" 


140 


Anzahl bencetigter Unterproarammekeren im Accu? 


c-Eeri 


est, 


1992 
411994 
21996 
41998 
2900 
szz002 
12063 
42005 
120086 
22007 
22009 
za1a 
22012 
2015 
s2a17 
ı2A18 
sza2a 
22021 
12023 
32024 
32025 
12026 
120283 
zza2a 


g 
in 


42044 
20495 
22048 
2054 
12053 
42057 
42058 
412060 
420682 
320653 
4205683 
32070 
32072 
20723 
42073 
320783 
42079 
20980 
32032 
420353 
320537 
208393 
42092 
32094 
42095 
42097 


+ FHMZ=ZIc WzZ - - - - - - 


ak 


CP'Yr 
BCC 
BHNE 
CHP 
BCC 
PHR 
LD* 
TrYA 
PHR 
LOA 
DER 
BPL 
JSR 
LD# 
PLA 
STA 
IN“ 
BMI 
PLA 
TA’r 
PLA 
CP'r 
BCE 
BNE 
CMP 
BCS 
RTS 


LD« 
IMP 
TRRA 
ASL 
TAs 
LDFA 
STA 
LODA 
STA 
JSR 
LDA 
STA 
JSR 
’SR 
LDY 
LODA 
PHR 
AND 
JSR 
INY 
PLA 
BPL 
JSR 
LDA 
LDY 
ISR 
LDY 
IN’ 
BEQ 
JSR 


s2 
420836 
4zaa2 
Si 
+42a36& 


er „, 
ST ch 


#16 
768) 


41766. 


34 


41767,% 


35 
594894 
#a 
19 
43735 
43345 
#0 


245 ,Y 


#127 
43347 


42078 
42618 
#105 
#163 
428306 
55 


42100 
43578 


+19 


gerua Flatz im Rrbkeitsspeicher 


Accu YR> ist Endadresse, bis zu 
der Speicherplatz kenoetigt wird 


Ist diese Adresse kleiner als mamentaner 
str ing-Anfangszeiger? Ja: RTS 

Recu, TR und 187 ,.2...2,96>) auf 

Stack zwischenspeicherHn 


> GARBAGE COLLECT. Str ingmuellkeseitiaung 
Accu, YR und «S7,....96> wiederherstellen 


Nochmals "Accu VYR> mit (51752) vergleichen 
Jetzt senua Platz? Ja: RTS 


sonst "OUT OF MEMORY ERROR" 


gabe van Fehlermeldungen und RERDYT-Status 


Code fuer "OUT OF MEMORY" 
Normalwert des Vektars (7697759), 58251 


Accu ı= 2 % Accu 


Startadresse der Fehlermeldung 
aus Tabelle in Painter (34,.35> bringen 


> CLRCHN. alle Kansele schliessen 


aktiver Eingake-Kanal :ı= Tastatur 
> Zei lemvorschukb drucken 
> "PN drucken 


Fehlermeldung zeicherweise in Rccu laden 


Bit 7” loeschen (ist beim letzen Zeichen = 1) 
> Zeichen im Rcecu ausgeben 


Mer im letzen Zeichen Bit 7 geretzt? 

Nein: weiterdrucken ... 

> CONT sperren, Stack und Descriptorindex rueckgetzen 
Accw’YR? ı= 41833, Stertadresse von " ERROR" 


> " ERROR" drucken 
Zeilennummer hiah <Cist im Direktmadus = 255) 


Direktomodus? Ja: weiter bei 42108 
> " IN " und Zeilennummer drucken 


141 


C5rn 854 BRSIC zZ - - - - - - 


Nusaabe varı 


42108 
42102 
42184 
42187 
421099 


42112 
42115 
42118 
42120 
42122 
421253 
42126 
42128 
42138 
42132 
42134 
42137 


LDA 
LD'Yr 
JSR 
LDA 
JSR 


JMP 
JSR 
sta 
STYr 
JSR 
TA% 
BEO 
LD« 
ST* 
BCC 
JSR 
JMP 


"RERDY.". Eingakewarteschleife 


#119 
#163 
4398086 
#128 
65424 


778) 
42336 
122 
123 
115 


42112 
4255 
38 
421489 
42361 
42977 


AccwVYR) :ı= 419346, Startasdresse non "RERDY. " 


> "READY." drucken 
Direktmodus einschalten 


= SETMSG, Ausgsabemodus setzen 


Hormaluwert des Yektaoars (/7a/7/1>: 42115 

> Eingsake-Warteschleife, zurueck nach "RETURN? 
CHRGET-Pointer auf 511 (ein Byte vor Einasbepuffer 
setzen 

> CHRGET holt nwechstes Zeichen 

setzt Zero-Fl393, falls Accu = 

keine Eingabe, zurueck zur WMarteschleife 


Fla9 fuer Direktmadus setzen 

Ist erstez Zeichen eine Ziffer? Js: Proarammzeile 

> Text im Eingabepuffer in BASIC-Tokens umwandeln 

> Interpreterschleife,. eingegebene Zeile ausfuehren 


Loeschen und Einfuesen „on Praurammzeilen 


42148 
42143 
42146 
42143 
42151 
42153 
42155 
42157 
42153 
42161 
42163 
42165 
42167 
42169 
42178 
42172 
42173 
42175 


42177 ° 


42179 
42181 
42183 
421835 
42187 
42188 
421393 
42191 
42193 
42194 
421976 
42197 
42139 
42280 
42202 
42204 
42206 
42207 
422093 
42211 
42212 


JSR 
ISR 
ST'r 
JS5R 
BCC 
LD'Y 
LDA 
5TA 
LDA 


43371 
42361 
11 
42515 
42221 
#1 


95) ,Y 


> Zeilennummer nach «“20721> hringen 

> Text im Eingabepuffer in BASIC-Tokene umwandeln 
Laenge der Zeile 

> Startadresse der Zeile nach 9%°96) 

Zeile bereits vorhanden? Neins kein Loeschen 
Startadresse hiash der naechsten Zeile 
Yariaklen-Anfanaspointer 10w 

Startadresse high der zu loeschenden Zeile 
Startza4resse lou der zu loeschenden Zeile 


Startadresse low der naechsten Zeile 


Yarisklen-Anfansspointer 1cow 
ergibt neuen Yariabkblen-Anfangyspointer low 


ekensca high 


startsdresse hiah der zu loeschenden Zeile 
ergsibt Anzahl der zu verschiekenden Pas93e=s 


Startadresse low der zu loeschenden Zeile 
Variaklen-Anfanaspointer low 

Laenge des Restakschnitts 

> 2557 Nein: weiter kei 42199 

Zaehler fuer 256-Brte-Bloecke um eins erhoehen 
Transportzeiger initialisieren 


Transfer-Schleife 


142 


+42 10908 


cBr 


SS BASIC 


_>eschen und Einfuegen von Programmzeilen (Fortsetzung? 


2214 
2216 
2218 
22219 
221 
22224 
2227 
12238 


42232 
12233 
12235 
12237 
12239 
2241 
12243 
12245 
12247 
42248 
2250 
42253 
122535 
4122537 
12260 
12263 
22689 
w267 
12269 
er | 
42273 
2274 
12277 
412279 
12288 
12282 
12285 
12298 


INC 
INC 
DEx 
BNE 


JSR 


ISR 
LOR 
BEQ 


ELC 
LDA 
sTaA 
ADC. 
STR 
LDY 
sSTr 
BCC 
INY 
STY 
JSR 
LDA 
LDY 
STR 
SsTTr 
LDA 
LD'Y' 
STR 
ST’Yr 
LOY 
DE'Y 
LODA 
sTtA 
DEY 
BPL 
JSR 
JSR 
JMP 


35 
37 


42207 
42385 
42291 

512 
42112 


45 
938 
11 
S8 
46 
91 
422483 


89 
41912 
28 
21 
s18 
s11 
49 
Sa 
45 
.4& 
11 


308," 
957 ,Y 


42274 
42335 
42291 
42112 


_ınkposinter fuer 


sc291 
12293 
2295 
12297 
122993 
12300 
12302 
2304 
2306 
127388 
12399 
+2311 


LOR 
LD'Y 
sta 
ST'Tr 
CLC 
LDY 
LDA 
BEQ 
LOW 
INT 
LDR 
BNE 


43 
44 
34 
35 


#1 


54 ,Y 


42335 
#4 


34) ,T 


42308 


> CHRGET-Pointer ruecksetzen. CLR 

> Linkepointer fuer Zeilen neu berechnen 

Mar erstes Zeichen im Eingsbkepuffer = B? 

Jar Zeile nur loeschen, zurueck zur Warteschleife 


Y“ariablenanfsngszeiger lou 
Endadresse+1 (Quellkereich> low 
Laenge der Zeile 

Endadresse+1 «Zielkereich> 1lou 
Yariaklenanfanaszeiger high 
Endadresse+1 CQuellkereich> hiah 


Vekertra9a addieren 

Endadresse+1 “Zielbereich> hiah 
> Block-YVerschieke-Rautine 
Zeilenrummer in C280721> 


nor Eingakepuffer setzen 
neuer Yzriaklen-Endezeiger al. 41915) 
Pcinter zuf Programmende+i1 


Zeilenliaenge 


Verschiebeschleife transferiert die neue Zeile aus 
Eingabepuffer in den Frbeitsspeicher 


CHRGET-Fointer ruecksetzen, CLR 
Linkpointer fuer Zeilen neu berechnen 
Zurueck zur Eingasbe-Warteschleife 


I 4 


q 
b} 


ceilen neu kerechnen 


Prosar sum -Anfangspointer 


als Suchzeiger nach (34,357) speichern 


Linkadresse high 
= 8? Ja: Programmende erreicht, RTS 
V”R auf erstes Zeichen des Programmtextes setzen 


Naechstes Zeichen = 8? 
Nein: Zeile moch nicht zu Ende, weitersuchen 


143 


u 2 Br © 


_ Erf © + BRSIC zZ - - - - - - + 3122 


Linkpcinter fuer Zeilen neu kerechnen (Fortsetzung? 


42313 INY 

42314 TYA Zeilenlaenge 

42315 ADC 34 Pceinter low auf aktuelle Zeile 
42317 TRA% 

42318 LDY #0 

42320 STR 234) ,.7 als Linkpcinter lcaw speichern 
42322 LDA 39 Pcinter hiah auf aktuelle Zeile 
42324 ADC #0 liekertray addieren 

42326 INY 

42327 STA 345,7 als Linkpceinter hiah speichern 
42329 ST*K 24 Startadresse der naechsten Zeile 
42331 STA 33 nach 1.34.35 speichern 

42333 BCC O2 4230a0R Unkedinater Sprung zum Zei lenantang 
42335 RTS 


Eingake-Warteschleife, zurueck nach "RETURN” 


423368 LDS 40 zeiger in Eingakepuftfer 
423383 JSR 57618 > Zeichen von Tastatur in Accu 
422341 CMP #13 Carrisase Return? 

42343 BEQ 42358 Jas Akschluss 

42345 STAA 512.8 Zeichen im Puffer zpeichern 
42348 INS Zeiger erhaecher 

42349 CPX #39 Puffer wall? 

42351 BCC 42338 NHeins weitermachen ... 
42353 LDS #23 Code fuer "STRING TOO LONG" 
42355 JMP 42039 > Fehlermeldung, REAUL!'T. 
42338 IMP 43722 > Abschluss der Eingske 


Text im Eingakepuffer in BASIC-Tokens umwandeln 


42361 JMP ıv’v2) Normalwert des Yektors (7727/7737: 42264 

42364 LDX 122 (122.123) zeigt auf erstes Zeichen im Einyskepuffer 
42366 LDY #4 Zeiger fuer cadierte Zeile 

42368 STY 15 "DATA’-Fl2aqg loeschen 

42370 LDRA 512,8 Zeichen aus Eingakepuffer holen 

42373 BPL 42332 ASCII Z 128 (ungeshiftet>? Jar weiter kei 42382 
42375 CMP 4255 Code fuer PI? 

42377 BEQ 42441 Jas abspeichern 

42379 INS Zeichen ueberlesen 

42380 BNE 42370 Unkedingter Sprung zum Schleifenanfang 

42382 CMP #32 Leercode” 

423934 BEQ 42441 Ja; abspeichern 

423836 STA 8 Code nach (8) speichern “wenn Code = 34 vol. 424745 
42388 CMP #34 Anfuehrungszeichen? 

4239308 BEQ 424783 Ja: weiter hei 42478 _ 

42392 BIT 15 Bit & gesetzt <ODATA>? 

42394 BWS 42441 Ja: ASCII ungesendert akspeichern , 

42396 CMP #463 Code fuer Fragezeichen (Abkuerzung fuer "PRINT”>? 
42398 BNE 424084 Neins weiter kei 42404 

42480 LDA #153 Token fuer "PRINT” skspeichern 

42402 BNE 42441 Unkedingater Sprung 


144 


c-Er 


+ FSH5SIc Vz - - - - - - 


42404 


Text im Eingakepuffer in BASIC-Tokens umwandeln “Fortsetzung? 


42494 
42406 
42498 
42418 
42412 
42414 
42416 
42418 
42419 
42421 
42422 
42423 
42424 
42427 
42428 
42431 
42433 
42435 
42437 
42439 
42441 
42442 
42443 
424486 
42449 
42451 
42452 
42454 
42456 
42458 
42460 
42462 
42463 
42465 
42467 
42469 
42472 
42474 
42476 
42478 
42479 
42482 
42483 


42435 
42497 
42439 
42490 
42493 
42495 
42498 
4250 
425093 
42505 
4250958 
42514 
42512 
42514 


CMP 
BCC 
CMP 
BCC 
STTr 
LDY 
STTr 
DE'Y 
sT#s 
DE= 
INT 
IN* 
LOA 
sEC 
SBC 
BEO 
CMP 
BNE 
ORA 
LDY 
IN» 
IN'Y 
STA 
LOA 
BEO 
SEC 
SEC 
BEQ 
CMP 
BNE 
STA 
SEC 
SBC 
BNE 
STA 
LODA 
BEQ 
cHP 
BEQ 
IN'Y 
sta 
IN 
BNE 


LOS 
INC 
IN'Y 
LDA 
BPL 
LOR 
BNE 
LDA 
BPL 
STA 
DEC 
LODA 
STA 
RTS 


#48 
42412 
#60 
42441 
113 
#0 

11 


122 


41113,Y 
42422 
#128 
42435 
11 
113 


Ssar,'r 
Sso7,'Y 
42595 


#33 
42460 
#723 
42462 
15 


#35 
42370 
S 
512,# 
42441 
3 
42441 


122 
11 


41117,YV 
42459 
41113,V 
42424 
Ss12,r 
42439 
Ssa9 ,'Yr 
123 
#255 
122 


Code < 437? 

Ja: weiter kei 42412 

Code > 607 

Nein: weiter bei 42441 

Painter auf coadierte Zeile merken 


Mortzaehler fuer Tokentaskelle initialisieren 


Zeiger auf Eingskepuffer zwischenspeichern 
falls Moart nicht gefunden? 


Yon Zeichencade im Puffer 


Zeichencode zus der Befehlstskelle zsuktrahieren 
Ergeknis = A? JIzası naechstes Zeichen 
Erseknis = 1283 (letztes Zeichen im Wort oder Abkuerzung)”? 
Nein: Befehl nicht gefunden, weiter kei 42435 

Bit 7 im Vlortzaehler setzen, ergibt Code fuer Token 
Pointer auf codierte Zeile wieder holen 


Code sakspeicherHn 
Zero-Flag setzen 


Mar Code = B (Endezeichen?”? Jar weiter kei 42595 
Code fuer Trennungszeichen "3,"? 

Ja: weiter kei 4d24&8A 

"DATA’-Code? (131 — 58 = 73) 

Nein: weiter bei 42462 

Fla4 fuer ’DATA” setzen 

Code fuer "REM’? “143 — 58 = ST” 


Neins zurueck zum Schleifenanfang 

8) ı= 8, falls Code fuer "REM” 
naechstes Zeichen aus Puffer 
Endezeichen?” Jar weiter kei 42441 
weiterhin Abspeicherung als RSCII? <ugl. 
Neins weiter kei 42441 


423836) 


Code abspeichern 
Sprung zum Schleifenanfang “RSCII Akspeicherung) 


Zeiger auf Eingabepuffer wiederherstellen 
Mortzaehler erhoehen 


Zeiger auf Anfang cles naechsten Befehls setzen 


Tabelle zu Ende? 

Nein: weiter kei 42424 

Naechstes Zeichen aus Eingabepuffer 
< 128? Jaır weiter kei 42439 

Code im Puffer speichern 
CHRGET-Fointer auf 511 ruecksetzen 


145 


CE &©ı+ PBnSIc WW - - - - - - -+27>1 


Berechnung der 
Eingabe: Zeile 


Rusgakbeı Zeile 


Sstartadresse eirer Proarsmmzeile 
nnummer in 120.21D 


vorhanden: 


Carry = 1, Startadresse der Zeile in (9596) 
Zeile nicht vorhanden : 
Carry = 0, Startadresse der naechsten Zeile in 95%”96) 
42515 LDA +3 Pointer auf Progr-ammstartadresse 
42517 LD* nz! 
42513 LDY #1 Index fuer Linkpainter high 
42521 STA 93 
42523 ST 96 
42525 LDA 95) ,Y Linkpainter hiah 
42527 BEQ 42560 = @a (Programmende)>? Ia: Zeile nicht gefunden 
42529 INY 
42539 INY VR := 3 
42531 LOA 2i gesuchte Zeilennummer hiah mit 
42533 CMPUOcI,Y Zeilennummer der aktuellen Programmzeile „eraleichen 
42535 BCC 42561 kleiner? Ja: Zeile nicht gefunden 
42537 BEO 42542 gleich? JIas weiter hei 42542 
42539 DEY YR ı= 2 
42540 BNE 42551 Unkedinsater Sprund 
42542 LDRA 2a gesuchte Zeilernummer low mit 
425344 DEY YR :ı= 2 
42545 CMP 95) ,7 Zeilernnummer der aktuellen Froarammzeile »ergleichen 
42547 BCC 42561 kleiner? Ja: Zeile nicht gefunden 
42549 BEQ 42561 gleich? Jar Ruecksprunga mit Carrv = 1 
42551 DEY YR := 1 i 
423552 LDA 957,7 Linkpointer high in AR 
42554 TAX 
42555 DET TR := 
42556 LDRA 935) ,Y Linkpointer low in Accu 
42538 BCS 42519 Unkedingter Sprung zum Schleifenanfang 
42560 CLC Flag fuer "Zeile nicht vorhanden” setzen 
425651 RTS 


BASIC-Routine 


NEW Senthaelt CLR> 


42562 BNE 42561 Folgyat Trennungszeichen? Nein: "SYNTAS ERROR” 
425694 LDA #8 

42566 TAY 

42567 STA 432,7 Null in die ersten keiden Stellen des Proasgr ammspeichers 
42569 INY 20499, 2050) schreiben 

42570 STR 437 ,YV 

42572 LORA +3 Progar amm-Anfanapointer low 

42574 CLC 

42575 ADC #2 + 2 

42577 STA 45 ersikt Yariaklen-Anfanspointer 10ow, 

42579 LDR 4 ebenso Progr amm-Anfasngspointer hish 

42591 ROC a leßertrag addieren 

42533 STA 46 ergibt Yariaklen-Antanaseointer hiah 

42585 ISR 42638 > CHRGET-Pointer ruecksetzen 

425883 LDA #09 Setzen der Zerc-Fl=3 fuer Uebergang zu CLR 


146 


c-Br ©S+ BRASIC WW - - - - - - 14er 


BASIC-Routine CLR 


42594 BNE 42637 Folst Trennunaszeichen? Neins "SYNTAX ERROR" 
42592 JSR 65511 > CLALL, alle Kansele loeschen 
425975 LOR ba te) oberste RANM-Grenze 

42597 LD’Yr 5& 

42599 STA 51 String Anfangaspointer 

42691 ST'Y 52 

42603 LDA 45 Yariaklen-Anfangspointer 

42605 LDY 46 

42607 STA 47 Arr av-Anfangyspointer 

42609 STTr 48 

428611 STA 49 VYariskblen-Endepeinter 

42613 ST'Yr 58 

42615 JSR 43937 > RESTORE 

426518 LD%S #253 Sstringdescriprtorzeiger ruecksetzen 
42628 STX 22 

426522 PLA Ruecksprungadresse merken 

42623 TA’TYr 

42624 PLA 

42625 LDS 4250 Stack ruecksetzen 

42627 T&S 

42528 FHR Ruecksprunaadresse wiederherstellen 
42623 TYR 

426536 PHA 

426231 LDA #0 

42633 STR 82 CONT sperren 

42635 STA 16 Fla93 fuer YVariaklenverwaltung 


42637 RTS 


CHRGET-Fointer ruecksetzen 


42633 CLC 

426393 LDR +3 Progr amm-Anfansspceinter low 
42641 ADC 4255 - 1 

42643 STA 122 .erasibt CHRGET-Pointer law 
426.45 LDA 34 Progr amm-Anfanaspointer hiah 
42647 ARDC 4255 + Vebertr393 
42649 STA 123 ersibt CHRGET-Pcointer hiah 
42651 RTS 


147 


CBM sS4+ BAasıc v2 _ _ _ £ _ _ 4z2&52> 


ERSIC-Routine LIST 


42652 BCE 42660 erstes Zeichen Ziffer oder 

42654 BER 4256608 Trennungszeichen? Ja: weiter bei 4zssa 

426565 CMP #171 folst "-" nach ’LIST”? 

42655 BNE 42637 Nein: STNTAX ERRÜÖR 

42660 ISR 43371 > erste Zeilennummer nach (Za.21) = A. falls "-" Falat) 
42663 JSR 42515 > Startadresse der Zeile nach "95%’96) 

425868 JSR 121 > CHRGOT holt letztes Zeichen 

42659 BEQ 426833 Trennunaszeichen? Ia: weiter kei 42533 

42571 CMP #171 "_") 

42673 BNE 42561 Nein: STNTAS ERROR 

42675 JSR 115 > CHRGET halt naechstes Zeichen 

42678 ISR 43371 > zweite Zeilennmummer nach (20.21> 

42651 BNE 42561 Folgt Trennunaszeichen? Nein: "SYHTA= ERROR" 

42683 PLA Ruecksprungadresse in Interpreterschleife entfernen 
428684 PLA 

426385 LDA 2a zweite Zeilennummer = 07 “oder Zeilennummer, falls nur 
42687 DFEA ei eine Nummer angegeken: daher funktioniert "LIST &” nicht) 
42689 BNE 426897 Nein: weiter bei 426937 

425371 LDA #255 

426593 STA 20 zweite Zeilennummer := 65535 <Maximalwert) 

42695 STA 21 i 

42697 LDY #1 Indirect-Pointer setzen 

42699 STYr 15 Quote-Madus abschalten 

427a1 LDA 95) ,Y Linkadresse hiah = & (Proarammende)>” 

42703 BEQ 42772 Ja: fertig, weiter kei 42772 (READY. > 

42705 JSR 43952 > RUNSTOP-Taste abfragen. ewtl. Abbruch 

42703 JISR 43735 > Zeilemwoarschuk drucken 

42711 INY 

42712 LDA 9) ,Yr Zeilenummer nach (X&R,’Accu) 

42714 TA 

42715 INY 

42716 LDA 957 ,.Y 

42718 CMP ei Ende erreicht? 

42z7’za BNE 42726 

42722 CPX 2a 

42724 BEQ 42728 

42726 BCS 42772 Ja: fertig, weiter bei 42772 

42725 STYr 73 YR zwischenspeichern 

4273a JISR 4898589 > Zeilennummer in String umwandeln und drucken 


148 


-er1 


+ BSA5lIc zZ - - - - - - 


35S1C-Routine LIST “Fortsetzung? 


42733 
42735 
737 
12739 
742 
42744 
2746 
2748 
12759 
12752 
12753 
2755 
Dt 
12739 
2760 
2762 
763 


LOR 
LD'Y 
AND 
JSR 
CMP 
BNE 
LOA 
EOR 
STA 
IN'Y 
BEQ 
LDA 
BNE 
TAr 
LDA 
TAs 
INT 
LOA 
SsTr 
sSTA 
BNE 


#32 
72 
#127 
43347 


42307 


41118," 


42799 
427986 


41118, 


42735 
43347 
42897 


Code fuer Space 

YR wiederherstellen 
Bit 7 lseschen 

> Zeichen drucker 
Anfuehrungszeichen? 
Nein: weiter kei 42752 
Qucte-Fla3 irwertieren 


kein Ende der Zeile nach 255 Zeichen? Ja: Rufhoeren! 
Naechstes Zeichen 

Zeilenende”? Nein: weiter bei 42775 

YR 


Startadresse der naechsten Zeile 


nach 99796) bringen 


Unkedingter Sprung 


> RAusgabke "RERDY.", Einasbewarteschleife 
Normalwert des Yektors (7747775) ı 42778 
Code < 1287 Ja: zurueck nach 42739 

Code fuer PI” 

Ja: zurueck nach 42739 

Quote-Madus eingeschaltet? 

Jas zurueck nach 42739 


Martzaehler fuer Befehlsworttakbelle 

YR zwischenspeichern 

Pceinter auf Befehlstakelle 

vermindern. Klartext fuer Token gefunden? 
Jas Rusdrucken, weiter 42807 


zeichen in Befehlswarttabelle 
uebkerlesen. kis 
letztes Zeichen des Befehlswartes erreicht 


Zeichen aus Befehlswarttakelle 

letztes Zeichen im Wort? Ja: zurueck nach 42735 

> Zeichen drucken 

Im Normalfall unkedingter Sprung (ausser Code 204) 


149 


+27 >33 


CB S©S+ BHRSIC WVZ - - = - - - 


BRSIC-Routine FOR 


42318 


42320 : 
42322 . 
42325 . 


42328 
42338 
42331 
428373 
42334 
423353 
42336 
42337 


42333 . 


42342 
42345 
42346 
42347 
42349 
42550 
42352 
429354 
42355 
42357 
428383 
42368 
42361 
42363 
423665 
42367 
42372 
42974 
42376 
428373 
42330 


429832 


423834 
42826 
42338 
42571 
42393 
42895 
42.338 
42901 
42983 
42385 
42338 
42311 
42914 
429317 
423173 
423208 
42922 
42923 
429325 


LDA 


#128 
15 
423429 
41366 
42835 


#15 


4164 
447933 
44422 
44426 

192 
#127 
98 

92 
4133 
#167 
34 

35 
44611 

#183 

#185 
430.34 

121 

#169 

42311 

115 
44426 
48171 
446008 
4 


73 


4129 


IS 11T 


Bit 7 in (165) setzen, um Annahme von Integer—- und Feld- 

„ariaklen z1ls Schleifemzsriskle zu verhindern 

> LET definiert FOR-HEXT-"zariable, Pceinter nach 173.745 

> Stack-Suchrautine zucht nach offener FOR-HEx-T-Schleife 
mit dieser Yarisblen. Gefunden? Hein: weiter kei 424335 

Stasckpointer auf alte Schleife setzen 


Ruecksprungadresse Interpreterschleife entfernen 


Zur Pruefung, ob Platz im Stack 
> Wenn Stackrointer “ 868, dann DUT OF MEMORY 


- 


> nsaechstes Trermzeichen suchen, Offset im "FR 


Offset zum CHRGET-Pointer sddieren, 
ergibt Startadresse der FOR-NE#=T-Schleife 
Startadresse lou zuf den Stack ablesen 


Vebertra4y addieren 

ebernscs hiah ur den Stack legen 

Aktuelle Zeilennummer \cou 

und 

Aktuelle Zeilennmunmmer Hhiah 

auf Stack lesen 

ERSIC-Code fuer 7TO’ 

> SYHCHR prueft, ob dieser Code fo1yt 

> FRMNUM pruestft, ok numerische Schleifen»ariskle faoalste 
> FRMEYL wertet Ausdruck aus, Ergekni= nach FRC 
Varzeichenkbyrte von FRL 37255 fuer +.7.—-) 

Bit @ kiss & fuer AHD setzen 

Bit @kis 6 im Accu mit Bits 9 kiz 5 von FRC „sleichmachern 
Ergebriz als MS5B speichern. Bit 7 eryikt Yorzeichen 
Ruecksprunaadresse 432591 fuer indirekten Sprımy 

cval. 446295 

nach 134.35> kringen 


> TD-Mert zuf Stzack sblesen, dann zurueck nach 92391 
Acc TR) = 47548, Startadresse (on 

Ersatzwert 1 fuer "STEP’ 

> 1 als STEP-Hert nach FRC bringen 

> EHRGOT holt letztes Zeichen 

BRSIC-Code fuer ’STEP’? 

Nein: kein STEFP-Wert angegeben, weiter kei 42311 
> CHRGET holt naechstes Zeichen 

> FRMEYL wertet Rusdruck aus, Ergehris nach FRC 
> holt Vorzeichenkrte 

> legt Worzeichen und STEP-Mert zuf Stack 
FOR-HEXKT-VYVariablenzeisger lau, 


FOR-NEXT-YVarisblenzeiger high 

und 

sbschliessend noch den Code fuer ’FOR’ 
auf den Stack legen 


150 


ceErnN 84 BRSIC VZ - - - - - - u nahe Drug = 


Interpreter-Schleife, 


32926 
329239 
32931 
432933 
42935 
42938 
12938 
32944 
12942 
12944 
412948 
32948 


ISR 
LDA 
LOY 
CPY 
NOP 
BEQ 
STA 
STy 
LDY 
LDA 
ENE 
LDY 
LOA 


43052 
122 
123 

#2 


42942 
51 
62 
+2 


1229,Y 


43215 


#2 


<122>.YV 


42958 
430933 


c122)>,Y 


Sr 


aa”, T 


gaar7z,Y 


I,T 


Routinenaufru?f 


> RUNSTOP-Taste akfragen, evtl. 
CHRGET-Pointer low, 
CHRGET-Pointer hiah 

= 2 <Direktmoadus>? 


Rhkruch 


Ja: weiter bei 42942 
Zeiger fuer CONT 


laufendes Zeichen 
= 0? Neins weiter kei 43915 


vekernaechstes Zeichen 


= a (Programmende?>? Neins weiter hei 42958 
> Programmlauf beenden 


naechste Zei lennummer 1cau 
nach 57) 


naechste Zeilennummer high 
nach 5393) 


CHRGET-Pointer auf letztes Bute nach 
neuem Zeilenkoprf setzen 


NHormalwert des Vektors (7767777): 42984 
> CHRGET holt naechstes Zeichen 

> Interpretation und Routinenaufruf 

> Zurueck zum Schleifenanfang 


Trennzeichen? Ja: RTS 

128 vom Zeichencode akziehen 

cz @ kein BASIC-Befehl>? Jas LET, weiter bei 4J3a12 
Code > 162 «NEW>? (182 — 128 = 35 
Jas weiter kei 43422 

Ergeknhis verdoppeln 

als Pointerins YR bringen 

Rdresse hish aus Tabelle 

auf Stack legen 

Adresse low aus Tabelle 

auf Stack legen 

> CHRGET holt naechstes Zeichen, RTS ruft Routine auf 


> LET. weist Yariaklen einen Wert zu 


Trennzeichen ":"7 

Jar zurueck nach 42997 

> "SYNTAX ERROR" 

BARSIC-Code fuer ’G0”? 

Nein: "SYNTAX ERROR" 

> CHRGET halt naechstes Zeichen 
BASIC-Cod> fuer ”TO” 

> SYHCHR prueft, ob dieser Code falgat 
> GOTO 


151 


CO Br 


BASIC-Routine RESTORE 


43437 SEC 
43033 LDA 
4304@ SBC 
43042 LD’Y 
43044 BCS 
43046 DEY 
43047 STA 
43043 STY 
43051 RTS 


43047 


late! 
E& 


+ >22 237 


vom Prosr aım-Anfangspointer 
eins suktrahieren 


eraibt ODATA-Zeiger 


BERSIC-Routiren END und STOP sowie Abfrage der RUNSTOP-Taste mit Akkruch 


43052 JISF 
43055 BCS 
43857 CLC 
43053 BNE 
43980 LDA 
43962 LDY 
43064 LDX 
43066 INK 
4+30&7 BEQ 
4308593 5TA 
43071 STY 
43073 LDA 
43075 LDY 
43077 STA 


43073 STYT 


43081 PLA 
43052 FLA 
43033 LDA 
43955 LDY 
43087 BCC 
+3039 JIMP 


43092 JMP 


BASIC-Routire CONT 


423495 BNE 
43997 LDX 
430899 LDOY 
43181 BNE 
43103 ITMP 


43186 LORA 
43108 STA 
43110 ST'Y 
43112 LDRA 
43114 LDY 
43116 STA 
43118 ST'Y 
43120 RTS 


53505 
43058 


43120 
122 
123 

= 


43081 


43120 
#26 
62 
43106 
42033 


51 
122 
123 

39 

sa 

57 

58 


> STOP prueft RUNSTOP-Taste 

Einsprung fuer ’STOP” 

Einsprung fuer END” 

RUNSTOP-Taste nicht sedrueclkt? Ia: RTS 
CHRGET-Fointer lau, 

CHRGET-Pointer high 

Zeilennummer high «255 im Direktmadus >”? 


Direktmoadus? Ja: weiter kei 43as1 
CHRGET-Pointer nach (51.62) 


sktuelle Zeilennummer fuer CONT 

in <39’60) aufbewahren 
Fuecksprungadresse aus Stack entfernen 
Accu YR3 3= 51857, 


Start=dresse fuer "EBERERE" 


Rufruf durch END? Ta: keine Russabe „an "BREAK" 
> "BRERK"—-Meldung. RERD'T. 


> Rusgsake "RERODY.". Eingakewarteschleitfe 


Folgt Trennungszeichen?” Nein: "SYHNTAS ERROR" s 
Code fuer "CRN’”’T CONTINUE" 

’"CONT” gesperrt? 

Neins weiter bei 43106 

> Fehlermeldung, RERD!YT. 


CHRGET-Pointer wiederherstellen 


Zei lernummer wiederherstellen 


152 


cBri 


=35IC-Routine RUN 


«2121 PHP 
s3122 LDR 
«3124 ISR 
3127 PLP 
3128 BNE 
x3130 JMP 


«3133 ISR 
13136 JIMP 


F#SIC-Routime GOSUB 


23139 LOA 
23141 ISR 
z232144 DA 
231465 FHR 
3147 LORA 
43149 PHRA 
«3150 LDA 
23152 FHR 
3153 LOA 
23155 PHRA 
3156 LDA 
3158 PHR 
43159 JISR 
22162 ISR 
33165 IMP 


#SIC-Rautine GOTO 


2:168 [SR 
3171 TSF 
423174 SEC 
+5175 LDRA 
413177 SBC 
3179 LOA 
23181 SBC 
3183 BCS 
12185 TYrA 
23186 SEC 
3187 ADC 
43189 LD: 
13191 BCC 
23193 IN“ 
43194 BCS 


23196 LOA 
23198 LD“s 
s2200 ISR 
3203 BCC 
22295 LOR 
13297 5BC 
23209 STR 
43211 LOR 
3213 SBC 
2215 STA 
43217 RTS 


#0 
53424 


423133 
42585 


42392 
43159 


#3 
41979 
123 


43371 
43273 


42 
44 
42519 
43235 
95 

#1 
122 
36 

#0 
123 


statusregister merken 
> SETMSG, Rusaakemoadus Festlegen 


folgt Tremnnunsszeichen? Nein: RUN mit Zeilernmummer 
> CHRGET-Pointer ruecksetzen. CLR 


> CLR 
> CHRGOT, GOTO, Interpreter-Schleife 


Zur Pruefung, cb Platz im Stack ° 
> Wenn Stackpeinter < 63, dann "GUT OF MEMORY" 
CHRGET-Pointer hiah, 


ÜHRGET-Pointer 1lou:. 
Zei lennummer hiah, 


Zeilennummer Ic, 

und 

akschliessend noch den Code fuer ”GOSURB” 
auf den Stack 

> CHRGET holt naechsztes Zeichen 

> GOTO 

> Interpreter-Schleife 


> Zeilennummer hinter GOTG nach 7209”21> bringen 
> Offset bis zum Ende der Zeile ins YR i 


Aktuelle Zeilennummer mit Zeilennummer 
nach "GOTO’ n»eraleichenr 
Groesser: weiter hei 43196 


Offset zum Zeilenende zum CHRGET-Pointer addieren 


UInkedinater Sprung 

Acc SR? ı= Pointer auf Progar ammanfang 

> Startadresse der gesuchten Zeile nach (93796) 
Zeile vorhanden? Nein: "UNDEF’D STATEMENT ERROR" 


von der Startadresse der Zeile 
eins suktrahieren 


ergikt neuen CHRGET-Pointer. zeigt auf Null-Code 
D 3 


153 


+2>2121 


 _Erf S5S4+ EBEASIC WwZ - - - - m - —ı 21:5 


BASIC-Rautine RETURN 


43218 BNE 43217 falast Trennzeichen? Nein: "SYNTARS ERROR" 

43228 LDA #235 

43222 STA r’4 FÜR-NEXT-YVarisaklenzeiger high zwangsweise definieren 
43224 JISR 41366 > Stack-Suchroautine sucht nach nz=echstem GOSUR-Ostensatz 
43227 TXS 


43223 CMP #141 
43230 BEQ 43243 


"GOSUB”-Code sefunden”? 
Ja: weiter kei 43243 


43232 LD8S #12 Code fuer "RETURN WITHOUT GÜSUB" 
43234 BIT u 

43235 LDX #17 Code fuer "UNDEF”’D STATEMENT" 
43237 JMP 42039 > Fehlermeldung, READY. 

43240 IMPF 448309 > "SYNTAX ERRÜR" 

43243 PLA "GOSURB’-Code vom Stack holen 
43244 PLA Zeilennummer vom Stack 

43245 STA I” nach {577337 krirmgen 

43247? PLA 

43243 STA 58 

43250 PLA CHRGET-Pceinter vom Stack 
43251 STA 122 nach (12271235 kringen 

433253 PLA 

43254 5TA 123 


BASIC-Routine DATA 


432565 ISR 43270 > Offset zum naechsten Trennzeichen feststellen 
43259 TrA 

43280 CLC CHRGET-Pointer auf naechstes Trennzeichen setzen 
43261 RDC 122 

43263 STA 122 

43265 BCE 43269 

43267 INC 123 

43259 RTS R 


Offset zum naechsten Trennzeichen feststellen 


43270 LDS 
43272 BIT 
43273 LD« 
43275 ST* 
43277 LOY 
43279 STY 
43281 LDA 
43283 LD*S 
43235 STA 
43237 STX 
43239 LDA 
43231 BEQ 
43233 CMP 
43235 BEQ 
43297 INY 
43233 CMP 
433808 BNE 
43302 BEQ 


1223 ,Y 


43263 
8 
43269 


434 
43289 
43281 


Trennzeichen zwischen Befehlen 


Trennzeichen zwischen Zeiler 
abspeichern 

Zaehler initialisieren 

3) ı= 


Zeichen holen 

Zeilenende? Ja: RTS 

= (8)? 

Ja: Yegebenes Trennzeichen sefunden, RTS 
Index erhoehen: 

Anfuehrungszeichen? 

NHeins weitersuchen ... 

Sonst erst (> und \&) vertauschen 


154 


cEnr 


3ASIC-Routine IF 


23304 JSR 
3307 JSR 
4331@ CMP 
43312 BEO 
43314 LDA 
33316 JSR 
43319 LOR 
3321 BNE 
43323 ISR 
237326 BEQ 
3328 JISR 
ı3331 BCS 
3333 JMP 


13336 JMP 


44446 
121 
#137 
43319 
#167 
447939 
97 
43328 
43273 
43259 
121 
43336 
43168 


429333 


SASIC-Routine ON 


43339 ISR 
43342 PHR 
43343 CHMP 
373345 BE® 
3347 CMP 
33493 BNE 
«3351 DEC 
3353 BNE 
43355 PLA 
13356 JMP 


413359 JISR 
«3362 JSR 
2273655 CHMP 
43367 BER 
133569 PLA 
23378 FRTS 


43504 


FRMEYL wertet Ausdruck zus. Ergebnis nach FRC 
CHRGOT holt letztes Zeichen 
BARSIC-Code Fuer ’7G0T0’? 

Ja: weiter kei 43319 

BASIC-Code fuer ’”THEN” 

> SYNCHR prueft, ob dieser Code folgt 
IF-Bedingung erfuesllt? 

Ja: weiter kei 43328 . 

> Offset des Zeilenendes ins "'R bringen 
CHRGET-Painter auf naechste Zeile setzen 
> CHRGOT halt letztes Zeichen 

Ziffer? Nein: kein Sprunabefehl 

> GOTO e 


1 WW 


> Interpreter-Schleife 


> GETBYT krirgt Wert von 8 kis 255 nuch <101)> 
letztes Zeichen merken 

Code fuer ’"GOSUB”’? 

Ja: weiter bei 43351 

Code fuer ’G0OT0O’? 

Nein: "SYNTAS ERROR" 

Yarisablerwert verminderrı 

Ergebnis = 97? Nein: weiter kei 43359 

letztes Zeichen vom Stack halen 


Ey 


> Interpreter-Schleife, Routinenaufruf 


> CHRGET halt naechstes Zeichen 

> Zeilerrummer nach (24/21> bringen 
Folst Komma? 

Ja: weiter kei 43351 

keine Sprungadresse „vorhanden 


155 


CceEer 5:4 BRSIC WwZ - - - - - - 


Lesen einer Zeilennummer und Umwandlung in 18-Bit nach (20.219 
Eingakes TIaufendes CHRGET-Zeichen im Accu, zugehcseriger Wert im Ststusregister 


Rusgakbke: 3) wern erstes Zeichen numerisch: 
Vlert der Zeilernnummer bis zum ersten nichtnumerischen 
Zeichen in 165-Bit-Integer in (24/21> 
k) wenn erstes Zeichen nicht numerisch: 
20. 21> := 8 


In beiden Faellen ist die Carrv-Fl=a93 Yyesetzt 


+3371 LDS #0 

43373 ST®& 2a szar'21> mit QO vorkesetzen 

433753 STA 21 

43377 BCS 43370 Zeichen numerisch? Nein: RTS 
43379 SBC 447 »om ASCII den Wert 48 zuktrahieren (Carry = 1) 
43381 STA ” .Ziffernwert merken 

43383 LDA 21 

43385 STR 34 

43387 CMP #25 Ergebnis im zulaeszigen Bereich (d-63999) 
43383 BCS 43347 NHeins im Normalfall "SYNTAX ERROR" 

43391 LDA 28 kisher gelesene Zahl 

43393 RSL mit 10 multiplizieren 

43394 ROL 34 

43396 ASL zweimal mal 2, 

43397 ROL 24 

43399 ADC za 

423421 STA 2a 

43403 LDA 34 plus vorherigen Wert, 

43405 ADC 21 

43487 STA 21 

43499 ASL 2a und dann verdoppeln 

43411 ROL 21 

43413 LDA 2a 

43415 ADC Y Ziffernwert addieren 

43417 STA 28 

43419 BCC 43423 

43421 INC 21 liekertr393 =ddieren 

43423 JSR 115 > CHRGET holt naechstesr Zeichen 

43426 JMP 43377 > Zurueck zum Schleifenanfang 


156 


CcBr 24 EBRSIC 


BRSIC-Rautine LET 


43429 
43432 
43434 
43436& 
43438 
43441 
43443 
43444 
43446 
43447 
434508 
43451 
43452 
43435 
43457 
43453 
43460 
43453 
43466 
43458 
43470 
43472 
43473 
43475 
43477 


43478 


43481 
43432 
43434 
33486 
43439 
33491 
433493 
43493 
43497 
433499 
43501 
43503 
43506 
43509 
3511 
43513 
43516 
43519 
43520 
43522 
43523 
33524 
43927 
33529 
43530 
43532 
43534 
3537 
35408 
3542 
3544 
: 3546 


JSR 
STA 
sTYr 
LDA 
JSR 
LOA 
PHRA 
LOR 
PHR 
JSR 
PLA 
ROL 
JSR 
BNE 
PLA 
BPL 
JSR 
ISR 
LDY 
LOR 
STA 
INT 
LODA 
STA 
RTS 


IMP 


PLA 
LO 
CP'r 
BNE 
JSR 
CMP 
BHNE 
LO 
STr 
sTYr 
STYr 
JSR 
JSR 
INC 
LD'Y 
JSR 
JSR 
TAX 
BEQ 
INS 
TARA 
JSR 
LD'Y 
INY 
CP'Yr 
BNE 
JSR 
JSR 
LES 
LDY 
LDA 
T’MP 


45195 
73 
v4 

#178 

44799 

14 


13 


44446 


44432 
42481 


434783 
43155 
45543 
#0 
190 


73>,YV 


101 


737 ,Y 


> YARSUC sucht Yariakle hinter LET, oder leat sie ar 
Yariaklenzeiger nach (73774) bringen 


Code fuer "=" 
> SYNCHR prueft,. ok dieser Code folgt 
Integer-Flas und 


Strimna-Flz93 auf Stack retten 
> FRMEYL wertet Rusdruck aus 


Bei String ist die Carry-Flag gesetzt, sonst Yelocescht 
> FRMNUM prueft, ob Ergeknis zum Yariaklentyp passt 
String? Jar weiter bei 43481 

Integer”? 

Nein: weiter kei 43478 

> FRC runden 

> FLPINT wandelt Fliesskommazahl in 18-Bit-Integer 


Brte hiah in Yariskle uvekertrasen, 


Brte lcou in Yariakble vebertrasen 


> Fliesskoammazahl aus FRAC in Yariskle uvebertr aygen 


Yariaklenzeiger hiahı 

= 191 <TI$, val. 45356 FF)? 
Nein: weiter kei 439564 

> FRESTR 

Stringalaenge = 67 

Nein: "ILLEGAL QUANTITY ERROR" 


FRC initialisieren 


> prueft auf Ziffer, addiert Wert zu FRC 
> FRC := 18 % FRC 
Stellenzaehler erhoehen 


> prueft auf Ziffer, addiert Wert zu FRC 
> RRG ı= FRC 


FRC = 80? Ia:s weiter bei 43527 


Expanent „on FRC erhoehen sentspricht FRC := FRC % 2) 
> FARC := <ARG + FAC> %* 2 

also insgesamt FRC := & %* FRC 

Stellenzaehler erhoehen 

= 6? 

Nein: weitermachen ... 

> FRC ı= 1A % FRC 


= 


> Fliesskomma in Integer umwandeln 


> SETTIM, Uhrzeit setzen 


157 


CB5n ©4 BR=SIC 


BRSIC-Rautire LET 


43549 
43551 
43534 
43556 
43559 
43561 


43564 
43566 
43568 
43570 
43572 
43574 
43575 
43577 
435793 
43531 
43583 


43585 


43597 
43599 
43591 
435393 
43595 
43597 
43599 
43602 
43504 


43606 . 


43549 
43611 
43613 
43615 


43617 . 


43620 
43622 
43624 
43626 
43628 
43631 
43633 
43635 
43637 
43538 
43640 
43642 
43643 
43645 
43647 


LDA 
JSR 
BEE 


345,7 
123 


43559 
45644 

#47 
435160 


#2 


100) ,Y 


cS0> ,Y 
73 ,.Y 


807 ,Y 
73>,YV 


(80) „Y 
73) ,YV 


Fartsetzung? 


Zeichen aus String halen 

> pruefen, ob Ziffer 

Ja: weiter kei 433359 

> "ILLEGAL QUANTIT'YT ERROR" 
428 (Carry = BD) zuktrahieren 
> Accu zu FRÜC scddieren 


Startadresse high des String unterhalk des 
Stringbereichs (<slso im Frosr smm)? 

las weiter kei 43595 

Groesser? Ja: weiter hei 423531 


Startadresse low des String 

mit Str ins-Anfangszeiger low vergleichen 

kleiner <also im Proaramm>?” Ja: weiter kei 43395 
Pointer hiyh auf Stringdescriptor 

mit Pointer high auf Anfang der Yariaklen vergleichen 
kleiner?” Ja: weiter kei 433395 

Groesser?” Ja: weiter hei 43602 

Pointer low zuf Stringadescripter 

mit Pointer low auf Anfana der Yariaklen vergleichen 
Groesser? Ja: weiter bei 436542 

Acc’ R> = Zeiger auf Stringdescripteor 


- 


> bis 43624 vekerspr insen 
Sstrinsalaerge 


> Speicherplatz pruefen, Strinapointer setzen 
cSa’g1> zeiat auf Strinrgdescriptor 


> Strins in den Strinskereich uvekertrauen 
Strinadescriptor steht in 37 ,...,.99) 


> mit Pointer auf. letzten Descrirtor vergleichen 


Strirgdescriptor als 5Strinaävarisklenwert in 
Yarisklentsbelle kringen 


158 


CcEr 5:4 FRS5Ic zZ - - - - - - 


BASIC-Routine PRINT# 


4336493 JISR 
43651 JMP 


43654 
43957 


BRSIC-Routine CMO 


43654 
43657 
43639 
43661 
43664 
4336655 
43667 
43670 
43671 


ISR 
BEQ 
LDRA 
IJSR 
PHF 
ST* 
JSR 
PLP 
JIMP 


47006 
43664 

#44 
44799 


19 
Sr824 


43698 


BRRSIC-Roautine PRINT 


436574 ISR 
43677 JSR 


Einsprung 


BEQ 
BEO 
CHP 
BEQ 
CMP 
CLC 
BEQ 
CHP 
BEQ 
CMP 
BEO 
JSR 
BIT 
BMI 
ISR 
JSR 
ISR 
ISR 
BHE 


43684 
43682 
43634 
43636 
43688 
43690 
43691 
43693 
43695 
43697 
43699 
43701 
43704 
437065 
43708 
43711 
43714 
43717 
43720 


Abschluss 


43722 
43724 
43727 
43723 
43731 
43733 


LOA 
sta 
LDS 
LO 
LOA 
BNE 


43309 
121 


fuer PRINT 


43735 
43751 
#163 
43763 
#166 


43768 
#44 
43752 
459 
43795 


45605 
46215 
43303 
43335 
4367Y 


#0 
S1l2,# 

4255 

#1 

12 

43751 


MD 


>.!E 
> CLRCH, Tastatur sktivieren 


> GETBYT holt Filenummer 

Folgt Trennzeichen? Ja: weiter kei 43664 
Komma-Ccode 

> SYNCHR prueft, ob dieser Code folgt 
statusregister fuer PRINT merken 
aktiver Ausgabe-Kanal 

> CHKOUT mit Fehlerbehandlung 
Statusresister wiederherstellen 

> PRINT 


> String drucken 
> CHRGOT holt letztes Zeichen 


Trennzeichen? Ja: weiter kei 437353 
Trennzeichen “nach ’TRB’” und "SPC”’7? Jaı 
BASIC-Code fuer ”"TRB’? 

Ja: weiter bei 43768 

BRASIC-Code fuer "SPE’? 

Flag fuer ’SPC’” setzen 

"SPC’-Code? Jar weiter bei 43768 
Komma-Coade? 

Ja: weiter kei 43732 

Code fuer Semikclon? 

’!as naechstes Zeichen lesen, 
> FRMEYL wertet Ausdruck zus 
str ing? 

Ja: String drucken. 


RTS 


Schleifenanfang 


Schleifenanfang 


> FRCSTR, wandelt FRC in String ab (256) um 
> String-Parameter holen 

> String. drucken . 

> ’CURSOR RIGHT” oder ”SPACE’” drucken 

U 


rnbkedingater Sprung zum Schleifenanfang 


der Einyabewarteschleitfe 


Eingabe-Puffer mit DB zabschliersen 
CHRGET-Pointer auf 511 setzen 


Aktiver Einaake-Kanal = Tastastur? 
Nein: RTS 


BRSIC-Rautime PRINT <Fortsetzung? 


43735 
43737 
43748 
43742 
43744 
43746 
43749 
43751 


LOR 
JSR 
BIT 
BPL 
1_DA 
SR 
EOR 
RTS 


#13 
4239347 
193 
43749 
#10 
439347 
4255 


Code fuer ’RETURN” 

> Zeilenvorschuk drucken 
Aktiver Eingake-Kanal < 1287 
Ja: fertig 

Code fuer ’"LINEFEED” 

> Zeichen drucken 


159 


CE S4 BRSIC 


Sprung zur naechsten vortabkulierten Positian 


43732 
43753 
43756 
43757 
43758 
437608 
43762 
43764 
43766 


SEC 
JSR 
TrA 
SEC 
SBC 
BCS 
EOR 
ADC 
BNE 


65520 


> PLOT, Cursaerpositicon lesen, Spalte im YR 


davan zalange 10 szsuktrahieren. 
kis Ergebnis negativ 
Vorzeichen umdrehen 
Zweierkomplement plus eins? 
Unkedinater Sprung 


Ausfuehrung won TRB und SPC 


43768 
43769 
43770 
43773 
43775 
43778 
43780 
437832 
423733 
43785 
43786 
437883 
43790 
43791 
43792 
43793 
43795 
43798 
43801 
43804 


43306 
43809 
43312 
43313 
439815 
43816 
43317 
43819 
43821 
43324 
43325 
43327 
43329 
438332 
43835 
439337 
43839 
43341 
439842 
439344 
439345 
439347 
43350 
43352 


PHP 
SEC 
JSR 
STy 
ISR 
CMP 
BNE 
PLP 
BCC 
TXA 
SBC 
BCC 
TAX 
INX 
DEX 
BNE 
JSR 
IMP 
ISR 
BNE 


ISR 
ISR 
TAs 
LDY 
INS 
DE* 
BEO 
LDA 
JSR 
INY 
CMP 
BNE 
JSR 
JMP 
LDR 
BEQ 
LDR 
BIT 
LDR 
BIT 
LOR 
JSR 
AND 
RTS 


46215 
46759 


#0 


43751 


34 
43847 


2,WV 


Fl393 fuer SPC (Carry = 8) merken 


> PLOT, Curscorpesition lesen, Spalte im YR 
Spalte merken 

> GETBYT holt TAB /’SPC-Farsmeter ins #R 
Folgt "3"? 

Nein: "SYNTAX ERROR" 

Carrv holen 
SPC? Isa: weiter 
TRB-Parameter 
kleiner als aktuelle Cursorspalte? 


bei 43721 


Jas nichts ausgeken, fertig 

Anzahl der Schritte kisr zum Takulator ins X&R 

SR als. Zaehler initislisieren 

sR vermindern 

= 8? Neins "CURSOR RIGHT” drucken. zurueck nach 43792 


> CHRGET holt naechstes Zeichen 

> Sprung zum RAnfanas der PRINT-Schleife 
> ’CURSOR RIGHT” oder ’SPRCE” drucken 
Unbedinater Sprung 


- 


> Stringpsrameter holen 


> FRESTR 

Str inalaenge 

Indirect-Pointer fuer Str imngausgake 
fertig gedruckt? Jas RTS 


Zeichen aus String holen 
> drucken 


War Zeichen ein ’CR’? 
Nein: zurueck nach 43816 


> EOR #255 6795 


> zurueck zum Schleifenanfang 
Rusgakbe ueber logisches File? 
Neins "CURSOR RIGHT” statt SPACE” 
Code fuer ”SPRCE” 


drucken 


Code fuer "CURSOR RIGHT” 


Code fuer "7?" 


> CHROUT mit Fehlerbehandlung 
statusflags setzen 


160 


cern 


+ FRARSIC WVZ - - - - - - 


+35 


Zehlerbehandlung kei INPUT. GET und RERD 


3853 LOA 
333855 BEQ 
43857 BMI 
+3859 LDY 
43861 BNE 
43363 LDA 
43365 LD'Y 
43867 STA 
43369 STYr 
+33871 JIMP 


33374 LDA 
33376 BEQ 
33878 LDXS 
43380 IMP 


3883 LOA 
43385 LDY 
+23387 ISR 
413890 LDR 
333892 LD'Y 
43894 STA 
33336 STY 
43893 RTS 


SRSIC-Rautine GET 


43899 JSR 
43902 CMP 
43904 BNE 
39065 JISR 
43909 ISR 
43912 LDA 
43914 JSR 
33917 ST® 
33919 ISR 
433922 LOS 
33924 LDY 
43926 LDA 
433928 STA 
43931 LDA 
43933 JSR 
33936 LDX 
33938 BNE 
33948 RTS 


SRSIC-Rautine INPUT# 


43941 JISR 
33944 LDR 
43946 ISR 
43949 STAR 
43951 ISR 
43954 JSR 
43957 LOR 
43959 JSR 
43962 LD%s 
43964 STS 
439656 RTS 


17 
43874 
43363 

#255 
43367 

53 

&4 

357 

58 
44308 


13 
43333 
#24 
42039 


#12 
#173 
433086 
&1 

SE 
122 


123 


459398 
#35 
43922 
115 
4700& 
#44 
447993 
19 
Sr6834 
#1 

#2 

#0 
13 
#64 
4447 
19 
43959 


47006 
#44 
44799 


Fla9 fuer INPUT (=). GET (=64>, RERD (=152) 
INPUT: weiter kei 43874 

RERD: weiter bei 439353 

GET: 

Unkedinster Sprung 

DATR-Zei lennummer 


als Zeilennummer fuer Fehlermeldung speichern 


> "SYNTAS ERROR" 


Eingabe ueber File? 
Nein: "REDG FROM START" 
Code fuer "FILE DATR" 

> Fehlermeldung, RERDY. 


Accu/YR> ı= 44300, Startadresse fuer "REODO FROM START" 


> Fehlermeldung drucken 
CHRGET-Pointer auf INPUT zuruecksetzen 


> Falls Direktmodus,. "ILLEGAL DIRECT ERROR" 
Folgt '%"7? 

Nein: weiter kei 43922 

> CHRGET holt naechstes Zeichen 

> GETEYT holt Filenummer ins XR 

Komma-Code 

> SYNCHR prueft, ck dieser Code folst 
Filenummer 

> CHKIN, Eingabevaorkereitung 

Eingskezeiger auf 313 setzen 


Endezeichen nach 513, da nur ein Zeichen geholt wird 
Fl39-llert fuer GET 

> halt Zeichen und krinst Code in Yariakle 

Eingabe ueber File? 

Jas CLRCHN, Tastatur aktivieren 


> GETBYT krinat Filenummer ins XR 
Komma-Code 

> SYNCHR prueft, ok dieser Code folst 
Filenummer 

> CHKIN, Eingabevorkberei tung 

> INPUT ohne Dialog 

Filenummer in Rccu 

> CLRCHN, aktive I/O-Kanasaele schliessen 


Tastatur aktivieren 


161 


CO Br 


BASIC-Rautine INFUT 


43957 
43969 
43971 
43974 
43976 
43979 
423932 
43985 
43937 
43990 
43993 
43995 
43997 
440008 
448982 
44984 
44997 


44018 
44813 
43015 
44917 
44019 
44822 


44025 
44027 
44029 
44932 
44035 


BASIC-Routine REROD 


44038 
44940 
44942 
44944 
44945 
44047 
44049 
440951 
44953 


44056 ! 


44058 


44060 | 


44062 
44064 
440665 
44068 
44070 
44872 
44074 
44076 
44979 
44081 
44033 
44035 
44988 
44091 
44093 
44095 


= RESASTLIC 


CMP 
BNE 
JSR 
LDR 
JSR 
JSR 
SR 
LODR 
STR 
ISR 
LDA 
BEQ 
JSR 
RHOD 
BEO 
JSR 
JMP 


LDR 
BNE 
LDA 
BNE 
JSR 
JMP 


LDR 
BNE 
JSR 
JSR 
JMP 


LDS 
LDY 
LDRA 
BIT 


#34 
43932 
44733 

#59 
44799 
43809 


Folat Anfuehrungszeichen? 

Nein: weiter bei 43932 

> Dialogstrirnrg erfassen 

Code fuer Semikolan 

> SYNCHR prueft, ck dieser Lode folgt 

> Dialogastring drucken 

> Falls Direktmodus, "ILLEGAL DIRECT ERROR" 

Komma-Code 

nach 311 

> evtl. "?" drucken, lekeraabke an Eingabewarteschleife 
Eingske ueber File? 

Hein: weiter kei Jd4ald 

> RERDST, Status lesen 

Bit 1 (Timeout Read) isolieren 

seloescht?” Ja: weiter kei 44018 

> CLRCHN, Tastatur aktivieren 

> DATA, Proaramm nach naechstem Trennzeichen forsetzen 


Erstes Zeichen aus Eingakepuffer = B “keine Einyake>? 
Nein: Eingabketext durch "RERD” verarkeiten 

Eingabe ueber File”? 

Jas nochmal probieren, zurueck nach 43998 


> Offset zum naechsten Trennzeichen feststellen 


> CHRGET-Pointer auf naechsten Befehl setzen 


Eingske ueher File? 

Tas "INPUT ohne "?", weiter kei 44035 
> Fragezeichen drucken 

> ”SPRCE” drucken 


> Eingabeusarteschleife 


DATA-Zeiger 
Flaswert fuer RERAD 
Flagwert fuer INPUT 
Flag setzen 


Eingskezeiger auf Eingasbesuelle setzen 


> YVARSUC sucht Variable ader least sie an 
VYariaklenzeiser nach (73774) 


CHRSET-Pointer 

nach (75/76) kringen 

Eingabezeiser 

nach CHRGET-Pointer kringen 

> EHRGOT holt Zeichen aus Eingabesweille 
Endezeichen? Neins weiter kei 44113 
INPUT/GET /RERD-F 139 

GET?- Neins weiter bei. 44997 

> CHRIN holt Zeichen vom aktiven Eingake-Kanal 
Zeichencode nach 3512 

cKR/YVR> = 511 


Unkedingater Sprung 


162 


cBnr 


SASIC-Rautine RERD <Fortsetzung) 


44097 
34899 
44101 
34103 
44106 
441893 
44111 
44113 
44118 
44118 
44120 
44122 
14124 
44125 
44127 
44129 
44131 


44133 
44135 
44137 
44133 
44141 
44142 
44145 
44146 
44143 
44150 
44152 
44154 
44156 
44157 
44160 
44163 
44166 


44159 
44172 
44174 
44177 
44180 
44182 
44134 
44136 


44139 
414191 
44193 
44195 
44197 
44192 
44201 
44203 
442053 
34208 
14210 
44213 


BMI 
LDR 
BNE 


44216 
19 
44106 


> BRrRSIc W222 = = = = = = 
RERD? Ja: weiter hei 4d421s6 
Eingske ueber File? 
Jaı weiter kei 44196 
> "7% drucken (falls zu wenige Einsaken kei 7”INPUT”> 


SR 
JSR 
STH 
sTYr 
’SR 
BIT 
BFL 
BIT 
BVC 
INS 
ST“ 
LDA 
sTtA 
BEU 


STR 
cHmPp 
BEQ 
LDA 
sth 
LDA 
CLC 
STA 
LDRA 
LDY 
ADC 
BCC 
INY 
JSR 
JSR 
JSR 
JMP 


JSR 
LOA 
JSR 
ISR 
BEQ 
CMP 
BEQ 
IMP 


LDA 
LO 
STA 
STY 
LDA 
LDY 
sta 
STTr 
ISR 
BEQ 
JSR 
JMP 


43345 
44025 
122 
123 
115 
13 
44169 
17 


44123 


122 


> Eingake-Warteschleife 
CHRGET-Pointer auf 511 setzen 


> CHRGET holt naechstes Zeichen 
Str inga-Yariakle”? 
Nein: weiter kei 44169 


. GET? 


Nein: weiter kei 44133 
CHRGET-Pcointer zuf 512 setzen 


Trennzeichen 
Unkedingter Sprung 


Code des naechsten Zeichens 

Anfuehrungszeichen? 

Ja: Carrv = 1, weiter kei 44146 

Code fuer ":", Endezeichen fuer Str inauebertr agung 


Komma-Code. Endezeichen fuer Stringuebertr a9ung 


CHRGET-Pointer bei Anfuehrungszeichen um eins erhoehen 


String vekertrasen 

String-Ende+1 in CHRGET-Pointer kringen 
Stringdescriptor <Variaklenwert?> in Yariaklentabelle 
kis. 44177 ueberspringen - 


By Zu ZEV zu 


> STRFAC, wandelt String..in Gleitkommazahl um 
Flag fuer Integer 

> FRC in Variable uebertragen 

> CHRGOT holt letztes Zeichen 

Trennzeichen?” Ja: weiter kei 441839 
Komma-Code” 

Ja: weiter bei 441893 

> Fehlerkehandlung 


CHRGET-Pcointer 

Eingabezeiger auf naechstes Datum 
CHRGET-Pointer 

wiederherstellen 


> CHRGOT holt letztes Zeichen 
Trennzeichen? Ja: weiter bei 442553 


> CHKCOM prueft, ok Komma folgt 


> Zurueck zur Einsakbe, falls weitere Yarisaklen 


163 


++,” 


CB 5:4 EBHSIc zZ - - - 


BRARSIC-Rautine RERD “Fartsetzung? 


44216 JISR 432708 Offset zum naechsten Trennzeichen ins YR 
44219 INY 

44220 TAX 

44221 BNE 44241 Zeilenende? Nein: weiter bei 44241 
44223 LDX #13 Code fuer "QUT GF DATA" 

44225 INT 

44226 LOA 122>,Y Linkpcinter hiah 

44228 BEQ 44333 = 0? Ja: Fehlermeldung 

4423 INY 

44231 LDA l22>,\Y Zeilennummer 1cu,. 

44233 STA 53 


44235 INY 


44236 LOA 122>,7T Zeilennunmmer hiah 

44239 INY 

44239 STA &4 nach (683764) bringen 

44241 ISR 432593 CHRGET-Pointer um YR erhoehen 
44244 TSR 121 > CHRGOT holt letztes Zeichen’ 
44247 TA 

44248 CPX% #131 BRSIC-Code fuer DATA? 

44250 BNE 44216 Nein: weitersuchen ... 

44252 IMP 44113 > Dateneinygzke fortsetzen 
44255 LOA 57 Eingabezeiger 

44257 LOEY 88 

442593 LD%S 17 INPUT GET /REARD-F 139 

44261 BPL 2 44266 RERD? Nein: weiter bei 44266 
44263 JMP 43047 DATR-Paointer := Einyabezeiger 
4426 LDYV #08 

44288 LDA (E72) ,T Naechstes Zeichen im Puffer 
44270 BEQ 4428983 = Endezeichen?” Ja: RTS 

44272 LDA 19 zu,viele Daten: Eingaake ueker File? 
44274 BNE 44233 Ja: RTS 

44276 LDA 4252 Accu/YR> ı= 44294, Startadresse von "EATRR IGNORED" 
44273 LDY #172 

44250 JIMP 439306 > Meldung drucken. FTS 

44233 RTS 


Fehlermeldungen fuer INPUT 


442384 63 859 88 54 S2 65 
44291 73 71 75 793 83 

44300 63 82 69 65 79 32 
44306 vo 982 79 v7’ 32 83 84 65 82 S4 13 


164 


?EXTRA 
IGNORED 
?REDA 

=) FROM START 


cEBErn S4+ BHSIc WW - - - - - - +31 


BASIC-Routine NEXT 


44318 BNE 44324 folgt Yarisakle? Iaı weiter hei 44324 

44320 LDY #0 Yariaklenpointer high ı= A Lugl. 41878) 
44322 BEQU 44327 Unkedinster Sprung 

44324 ISR 45195 > YARSUC zucht Variable 

44327 STA ‚3 Zeiger nach (73774) 

44329 STY v4 

44331 ISR 41866 > Stacksuche nach zusehcerigem FOR-NEXxT-Datensatz 
44334 BEQ 44341 Gefunden? Jas weiter bei 44341 

443365 LD% 410 Code fuer "NEXT WITHOUT FOR" 

34338 JMP 42039 > Fehlermeldung, READY. 

44341 TXS 

414342 TARA 

44343 CLC 

44344 ADC #4 

442346 PHA Zeiger auf Exponenten des STEP-Werts 

414347 ADC #6 

44349 STA 3& Zeiger auf Expanenten des TO-Werts 

44351 PLA 

44352 LOY #1 

44354 JSR 43034 > STEP-Wert nach FRC kringen 

414357 TS5% 

44358 LOR 269,8 VYorzeichenkyte 

44361 STA 1a2 nach <182> krinsen (VYoarzeichenkvte fuer FRC) 
44363 LDA 23 FÜR-NEXT-Yariaklenzeiger nach ÜRAccu’YR) 
143685 LD'Y v4 

44367 JSR 4r207 > STEP-Wert zum FOR-NEXT-Yariaklenwert sddieren 
44370 ISR 2 48a30 > Ergeknis in FOR-NEXT-Yariable vekertrasgen 
34373 LD'Y #1 

34375 ISR 48221 > FOR-NEX&T-VYarisklenwert mit TO-biert vergleichen 
14373 TSX 

4143793 SEC 

414380 SBC 285.8 

434333 BEQ 44408 Groesser : FOR-NEXT-Schleife verlassen 

44335 LOA er1,8 Zeilennummer des Schleifensnfangs aus Stack 
34338 STA 57 nach (57758) kringen 

34390 LDA 272,8 

34393 STR 58 

44335 LOA 274,X% Schleifenanfzena in CHRGET-Painter 

14393 5TA 122 

3440@ LOA er73,# 

414493 STA 123 

34405 IMF 423265 > Interpreterschleitfe 

444A8 TAR 

44409 ADC #17 Daten fuer FOR-NEXT-Schleife 

44411 TAX aus Stack entfernen 

34412 TXS 

44413 JSR 121 > CHRGOT holt letztes Zeichen 

344165 CMP #44 Komma-Clode” 

44418 EBENE 44405 Hein: Interpreterschleife 

44420 ISR 115 CHRGET holt naechstes Zeichen 


. \ „? 


44423 JISR 44324 Naechste FOR-NEXT-Yariakle bearbeiten 
’ISR”’” fuer Stacksuche (val. 41866 ff), 


e=z erfolgt kein zugehoeriges ’RTS” 


165 


cC-Brn S4+ RBRrAsSliIc v2 5 - z 5 = = Ps WE BD er) 


Auswertung und Pruefung van Rusdruecken 


44426 ISR 44dds > FRMEVL 

44429 CLC Kennzeichnung fuer Test auf numerisch 
44430 BIT a 

44431 SEC Kennzeichnung fuer Test auf Strina 
44432 BIT 123 Flag fuer String gesetzt? 

44434 BMI 44439 Jas weiter kei 44439 

444365 BCS 2 44ddı falls Carry gesetzt «Test auf String>,. TYFE MISMATCH 
44438 RTS 

444239 BCS 444383 falle Carry gesetzt, RTS 

44441 LDS #22 Code fuer "TYPE MISMRATCH" 

44443 IMP 42039 > Fehlermeldung, READ'T. 


Ruswertung von Rusdruecken 


44448 LDX 122 CHRGET-Pointer 

44443 BNE 44452 

44450 DEC 1223 um eins zuruecksetzenr 

44452 DEC 122 

44454 LDS #0 

44456 BIT ee 

44457 PHA Retten der Operatormaske 

4445593 TXSA 

444539 PHRA und Retten des Prioaritaetswerts auf den Stack 
44450 LDA #1 


44462 ISR 41979 > Falls Stackeointer < ed, darn "GUT OF MEMORY ERROR" 


444685 ISR 44675 > naechstes Element der Ausdrucks auswerten 
444658 LDA a 

44470 STA ’7 Operatormaske loeschenr 

44472 ISR 121 > CHRGOT holt letztes Zeichen 

44475 SEC 

44476 SBC #177 vom Operatarcode 177 zukbtrahieren 

44478 BCC 44503 < 0? Ja: weiter kei 44503 


44432 CMP #3 >= 3 (also Code >= 1895? 


44482 BCS 44503 Jas kein Zeichen von 177 kis 179 (>=<S). weiter kei 44503 
44434 CMP #1 Hier erfolat der Zusammenkau der Operatarmaske in den 
444385 ROL Bits &© kis 2 in (77), wenn Codes im Bereich „an 177 bis 
44437 EOR #1 kis 179 folgen. Es eryeken sich folgende Mcealichkeiten: 
44433 EOR ’r’ 

44491 CMP Yr Relation I > I = I}= I < I<d> I<= lsanst 

44493 BCC 44592 77) ı1ı ı2ı3193 15 16 a 

44495 STA Y’v 

44497 JISR 115 > CHRGET holt naechstes Zeichen 

4450a JMP 4 44475 > naechstes Zeichen der Operatarmaske auswerten 

44503 LD} ’v Operatarmaske 

44505 BNE 44551 = 8? Nein: weiter kei 44551 

44507 BCS 44632 Mar Cade >= 1887 Ias weiter kei 44632 

44509 RDC #7 Mar Code < 170? 

44511 BCC 44632 Jas weiter kei 445832 

44513 ADC 13 Stringsadditian? 

44515 BNE 445204 Nein: weiter hei 44520 

44517 IMP 46653 > Strinwverknuepfung 

44520 ADC %255 Code wiederherstellen ‘Carry wurde addiert. „gl. 445139 
44522 STA 34 34) ı= Code — 178 ü+,-,%,7,T,RND,OR> 

44524 ASL nerdoppeln 

44525 ADC 34 und <34) addieren, also mit drei multirlizieren 

44527 TAY als Zeiger ins YR 

44528 PLA Prioritsetswert der vorherigen Operation 

44529 CMP  410883,Y mit Prioritaetswert des momentanen Operatoars veraleichen 
44532 BCS 44637 kleiner? Neins weiter kei 44637 


166 


cBnN S4+4 PBHRHSIc 


Auswertung 


44534 
44537 
44533 
414541 
44542 
44544 
44546 
44547 
44549 


44551 
414553 
44554 
44555 
4145537 
14559 
434561 
44563 
+4565 
14567 
434569 
44572 
44574 


44576 
44579 
44530 
44583 
+45934 
44537 
14589 


+4592 


34595 
44597 
$4500 
44601 
14602 
34604 
44506 
44507 
44609 
$4610 
4611 
14614 
34616 
44617 
445613 
146208 
44522 
14623 
44625 
44626 
44628 
44629 


44632 
44624 
14635 


JSR 
PHR 
JISR 
PLA 
LD' 
BPL 
TA« 
BEN 
BNE 


LSR 
TARA 
ROL 
LD« 
EBENE 
DEC 
DEC 
LD'Y 
STA 
BNE 
CHP 
BCS 
BCC 


LDA 
PHRA 
LOA 
PHA 
JSR 
LDA 
IMP 


JMP 


LOA 
LOS 
TA'Yr 
PLA 
STR 
INC 
PLA 
sSTA 


‚"TrR 


PHR 
JSR 
LDRA 
PHR 
LDR 
PHR 
LDA 
PHR 
LDA 
PHR 
LORA 
PHR 
JMP 


LD'Y 
PLA 
BEQ 


von Rusdruecken (Fortsetzung? 


444293 


445283 


41033,'Y 


44546 
44537 


41090 ,'Yr 


41039, 


44595 

77 
44457 
448098 


102 


410938 ,Y 


34 
24 


> FRMNUM prueft auf rumerisch 
Prioritsetsflag auf Stack legen 
> Operatar-Routinenadresse + Operand auf Stack, Rekursion 


Operator? 

Ja: weiter bei 4453693 

noch offene Operatianen? 

Neins Exponentkyte von FRC in Recu, RTS (Auswertungsende> 
RARRG vom Stack holen 


Bit 7 im Stringa-Flag loeschen 
Operatormaske 

um eine Stelle nach links verschieben 
CHRGET-Pointer 


um eins zuruecksetzern 

Offset „con Priaritsetswert fuer >=<C 
als neue Operatormaske speichern 
LInbedingter Sprung 

<Accu> mit Prioritaetsfla9g vergleichen 
Groesser? Jar weiter bei 444 

sonst weiter auswerten 

Rdresse hish der Operatorroutine 


Adresse low der Oper=atarroutine 


> Operand zuf Stack legen 
Operatormaske laden 

und zurueck zum Rautinenanfana 
> "SYNTRAS ERROR" 


VYozeichenkyte von FRC 
Prioritsetswert fuer Dperatior 


Ruecksprungadresse vom Stack holen 
und um eins erhoehen “nur low!) 
Vorzeichenbkyte von FRC 

auf Stack legen 


>» FRC runden 
FRC auf Stack ablegen 


> Indirekter Sprung 
Flagwert fuer fehlenden Operator 


Prioritaetsflag 
= 8? Jas weiter kei 44672 


167 


CO Br 


> SHSIc zZ - - - - 


Auswertung von RAusdruecken (Fortsetzuna?” 


44637 
4465393 
44641 
44644 
44546 
44647 
44648 
446530 
446531 
44653 
44854 
44656 
44657 
44659 
44660 
44662 
44563 
44665 
446866 
44658 
44670 
44672 
44674 


CHMP 
BEO 
JSR 
STTr 
PLA 
LSR 
STA 
PLA 
sTtA 
PLA 
STR 
PLA 
sSTA 
PLA 
STA 
PLA 
STA 
PLA 
STR 
EOR 
STA 
LDA 
RTS 


Naechstes 


44675 
44678 
44698 
44632 
44685 
446587 


44699 
44693 
44695 


44598 
44790 
44782 
44704 
44706 
44709 


Gleitkommakonstante PI 


JMP 
LDRA 
STA 
JSR 
BCS 
I’MP 


JSR 
BCC 
JMP 


CMP 
BNE 
LDRA 
LDY 
JSR 
JMP 


1308 


CHMP 
BEO 
CMP 
BEQ 
CMP 
BEQ 
CHMP 
BNE 


#100 
44644 
44429 

75 


111 
97 


79) 
#0 
13 
115 
44590 
43371 


45331 
44698 
44840 


#255 
44717 
#168 
4174 
48034 
115 


v3 15 218 161 


#46 
44687 
#171 
44313 
4170 
44692 
#34 
44748 


Priaoritaetsflag fuer (=>? 

Ja: weiter kei 44deadd 

> FRANUM prueft zuf numerisch 
Fla93 fuer Operator 


ARG vom Stack holen 


VYarzeichen von ARG mit Vorzeichen „an FRAC verknueptfen 


Expanentbyvte var FRAC 


Element auswerten 


Normalwert des Yektaoars 1778.77 9) 3: 


Str ina-Fla9 ruecksetzen 

> CHRGET holt naechstes Zeichen 
Ziffer?” Nein: weiter bei 445890 

> Wert der folgenden Zahl nach FRC 


> prueft, ck Buchstake folgt 
folgt Buchstabe”? 
Jas weiter kei 44344 


BASIC-Code fuer PI 
Nein: weiter kei 44717 


44670 


Accw’YR) ı= 44712, Startadresse fuer Fliesskommazahl PI 


> Konstante FI in FRC bringen 
> CHRGET halt naechstes Zeichen 


3.14159265 


Code fuer Dezimalpunkt? 

Ja: Wert der folasenden Zahl nach F 
Code fuer "-"? 

Jas weiter kei 44813 

Code fuer "+"? 


Jaı Zeichen ignorieren, weiter kei 44682 


Code fuer Anfuehrungszeichen? 
Neinsı weiter kei 44748 


168 


AC 


Br S4 BRSIC W222 - - - - - - 


waechstes 


4733 
14735 
44737 
147393 
241741 
414742 
14745 


14748 
141750 
14752 
14754 


14756 
14759 
11761 
141753 
3764 
1756 
14768 


4771 
14773 
14775 
241778 
14780 
14782 


11785 
14738 
44731 


LDA 
LD'Y 
ADC 
BCC 
INY 
JSR 
JMP 


CMP 
BHE 
LOW 
BNE 


JSR 
LDR 
EOR 
TAY 
LDA 
EOR 
JMP 


CMP 
BNE 
IMP 
CHF 
BCC 
JMP 


ISR 
JSR 
LOA 
BIT 
LDA 
BIT 
LOA 
LD'Y 
CMP 
BNE 
IMP 
LD*S 
JMP 


LD'Y 
PLA 
PLA 
JMP 


SEC 
LDA 
SBC 
LDA 
5BC 
BCC 
LODR 
SBC 
LDA 
SBC 
RTS 


#24 
44315 


45503 
ıa1 
4255 


190 
#255 
4539693 


#165 
44778 
450683 

4184 
44785 
44967 


44794 
44446 
#41 
440 
444 
40 


.122>,Y 


44303 
115 
#11 

42039 


#21 


+47 33 


Element auswerten (Fortsetzung? 


um eins erhoehten CHRGET-Pcinter 
<Carryv = 1> nach (Accw’YR) bringen 


> String in Stringkereich transferieren 

> CHRGET-Fointer hinter Stringende setzen 
BASIC-Code fuer NOT? 

Nein: weiter kei 44771 

Offset fuer Priorit=zetswert in Takelle 
Unkedingter Sprung 


> FLPINT wandelt Fliesskommazahl in 16-Bit Integer um 
Integer invertieren 


= INTFLP wandelt Integer in <Rccw’YR> in FLP in FAC um 


BRSIC-Code fuer ’FN’”? 

Neins weiter bei 447783 

> FN. Funktionsauswer tung 

Funktion CInterpretercodes von 188 kis 282)? 
Nein: weiter bei 44785 


[y 


> Berechnung „on Funkticnen 


> prueft, ob "cc" folgt 


> FRMEVYL wertet Klammer ausdruck aus 
Code fuer ">" 


[ode fuer "«C" 

[ode fuer "," 

mit 12aufendem CHRGET-Zeichen vergleichen 
Ungleich? Ja: "SYNTAX ERROR" 

> CHRGET halt naechstes Zeichen 

Code fuer "SYNTAX ERROR" 

> Fehlermeldung, RERDY. 


Offset auf Prioritaetswert fuer Yorzeichenwechsel 
> Zurueck in Auswertungsroutine 


Zeigt Yarisablenpcinter auf Bereich von 489609 kis 582737? 


Nein: RTS 


169 


OBN &ı+ BSH>SIc Vz - en - = = e +5 40 
Naechstes Element suswerten (Fartsetzung? 

44340 ISR 45195 = YARSUC., sucht Yariakle “kein Anlegen!, val. 45341 Fr) 
44343 STA 109 Fointer auf Yariakle’Descriertor nach (194/191) 
442345 ST'Y 101 

44347 LDXS 69 69/70) enthzaelt Namen der Yariablen 

443493 LDY 70 

44851 LDA 13 strinwariskle? 

44353 BER 44593 Nein: weiter kei 44893 

44355 LDA #40 

44857 STA 112 

44359 ISR 449328 > Zeigt Yariaklenpointer auf Bereich von 40984 bis 58273? 
448862 BCC 445392 Nein: RTS 

44364 CPX #34 Stringvariakle ’TI$”? 

443866 BNE 448392 

44868 CP'Yr 4201 

44870 BNE 44892 Neinı RTS 

44872 ISR 44932 > Uhrzeit nach FRAC kringen 

44975 STY 94 94) ı= a «Flags fuer Exponentisaldarstellung 

44877 DEY von Zahlenstrings loeschen? 

448373 STY 113 113) ı= 255 «“Peinter fuer Startadresse des Strings? 
44830 LOY #& 

44882 STY 933 Anzahl der Stellen des Strings 

448834 LDY #36 Pointer auf Stellenwerte zur Berechnung „can TI$ 
449886 JISR 48744 > Striny erzeugen 

443839 JMP 46191 > krinat String in Strinabereich 

44892 RTS 

44393 BIT 14 Inteser-VYariable? 

448953 BPL 44918 Nein: weiter kei 44918 

44397 LD'Y %0 

44399 LDA <100) „'r Wert der Inteser-Variaklen 

44991 TAX 

443082 INY 

44903 LDA 19a) ,'Y aus der Yariaklen in FRC bringen 

44305 TAY 

44906 TARA 

44397 IMP 45969 > INTFLP wandelt Integerzahl in. Fliesskommazahl um 
44910 JSR 44828 > Zeigt Yariaklenpointer auf Bereich Von 40I6A kiss 583273? 
44913 BCC 44968 Neins weiter kei 449608 

44915 CPx 434 erstes Zeichen des Yariaklennamens = "T'"? 

44917 BNE 44946 Nein: weiter kei 44946 

44919 CPY #73 Yariakle ’TI’? 

44921 BNE 44960 Nein: weiter kei 44968 

44923 JSR 44932 > Uhrzeit nach FRÜC kringen 

44926 TYR Accu? = 08 

44927 LDX #168 Expanentkyte fuer FRC P 

4492939 JMP 48207 > FRC aufbereiten und linkskuendig machen 

44932 JSR 65592 > RDTIM liest Uhrzeit 

44933 ST*X 100 nach FRC uekertrasen 

449337 STY 939 

44939 STR ıa1 

44941 LDY #8 

44943 ST'Y 938 98) = B 

44945 RTS 


170 


C-PM SI BRSIC zZ - - - - - - un Le 2 2 


Ruswertung von Rusdruecken <Fortsetzung? 


44946 CPX #33 erstes Zeichen des Yariaklennamens = "SS"? 
44943 BNE 449608 Neins weiter kei 44964 

44930 CPY #84 Yariable ’7ST”"? 

44952 BNE 44960 Nein: weiter kei J4964 

44954 JSR 85463 > REARBDST liest Statusvariable 

44957 JIMP 4898188 > Statusbyte nach FAC bringen 

44960 LDOA 194 <Accu/yYR) se Feinter auf Yariakble 

44982 LD'Y 101 

449654 IMP 48034 > Mariakle nach FRC kringen 


Aufruf von Funktionen 


4493687 RSL BASIC-Cocde verdoppeln (AND 32557 

44958 PHRA 

44969 TAX 

4497a TSR 115 > CHRGET halt naechstes Zeichen 

44973 CP #143 BASIC-Code < zaar (143 + 256 + 1 = 20a %* 25 
44975 BCC 45009 Ja: weiter kei 45049 


"LEFT$’”, "RIGHT$”. ”MID$” 


44977 ISR 44794 > prueft, ob "«" falat 
4495QA ISR 44446 > FRMEVYL wertet Ausdruck aus 
449833 JSR 44797 > CHKCOM prueft, cb Komma folst 
44995 ISR 44431 > FRMNUM prueft, ob Stringvariakble 
44983 PLA 
449390 TAX 
449931 LOA 101 Adresse des Strinasdescriptors 
44993 PHA 
443934 LDA aa 
449936 PHA 
44397 TXA BARSIC-Coade # Z <RND #25 auf Stack retten 
449933 PHA 
449339 ISR 47006 > GETBYT kringt zweiten Parameter ins XR 
45002 PLA 
35093 TAY BRSIC-LCode fuer Funktionsroutinenaufruf ins YR 
45004 TAÄR 
450905 PHA zweites Argument auf Stack 
35aR& JIMP 45014 > Funktionsroutinenaufruf 
45003 JISR 44785 > wertet Klammer ausdruck aus 
45912 FLA BASIC-Code fuer Funktionsroutinenaufruf ins YR 
45913 TAY 
45014 LOAR 4a93S,Y Startadresszse der Funktion nach (33.36) 
45017 STR 35 kringen (in 84 steht der Code fuer JMP)> 
45019 LDA 44939,'Y 
45022 STA 36 
45024 ISR 84 > Funktionskerechnung 
<Rueckkehr nur bei Funktionen mit numerischen Resultat) 
45027” JMP 44429 > FRMNUM prueft, ob numerisches Ergeknis 


Rusfuehrunga von RAND und OR 


459030 LDY #253 Einzprung fuer ’OR’ 

45032 BIT ei 

45433 LOY #0 Einsprung fuer ’AND” 

45035 STYr 11 Flas fuer "AND” oder ’OR’” setzen 

450937 JSR 45503 > FLPINT wandelt FRC in 16-Bit Inteser nach “10071017 


171 


CC EBr1 


er BASIC WW - - - - - - 


Rusfuehrung von AND und OR «Fortsetzung? 


4Sa4u 
45a4Z 
45044 
45046 
45043 
45058 
45052 
45955 
45958 
45958 
45062 
4554 
45066 
45a67 
450659 
4571 
45073 
45975 


Rusfuehrung won => 


45078 
45081 
45033 
45985 
450987 
45939 
45091 
45093 
45995 
45998 
45099 


45102 
45194 
45106 
45188 
45111 
45113 
45115 
45117 
45119 
45121 
45124 
45126 
451283 
45129 
45139 
45132 
453134 
453136 
45138 
45140 
45142 
45144 
45146 
45147 
45143 
45149 
45151 
45153 


LDRA 
EOR 
STR 
LDA 
EOR 
STR 
JSR 
JSR 
LDR 
EOR 
AND 
EOR 
TAY 
LOA 
EOR 
AND 
EOR 
JMP 


JSR 
BCS 
LDA 
ORR 
AND 
STR 
LDA 
LDY 
JSR 
TAX 
JMP 


LDA 
STR 
DEC 
JSR 
STR 
sTt* 
sSTr 
LDA 
LDY 
JSR 
sT* 
STY 
TAs 
SEC 
SBC 
BEQ 
LDRA 
BCC 
LDXS 
LDA 
sSTA 
LDY 
IN 
IN'Y 
DEX 
BNE 
LDXS 
BMI 


130 
11 

r 

101 
11 

3 
45124 
45503 
121 


44432 
45192 


>= FRC ı= RARG 
> FLPINT wandelt FRC in 165-Bit Integer nach (100161 > 


> INTFLP wandelt Inteser in FLP in FRC mit Yorzeicher 


> Prueft. ok richtiser Yariaklentvp 
String? Jar weiter bei 451092 
ARG in Speicherformat umwandeln 


Acc YR> := 195, Adresse won RARG 

> vergleicht FRC mit ARG 

> krinst Wahrheitswert (8 ader —-1> nach FRC 
str ings-Fl39 zuruecksetzen 

Operator -Maske 

> FRESTR 

97) ı= Stringlaenge 

93’) ı= Startadresse des ersten Strings 


Zeiger auf zweiten Strina 


> FRESTR “mit Descriptorpcinter in \Accw"rYR?) 
Startadresse des zweiten Strings nach ©108.’109)5 


Laernge des zweiten Strinas im #R merken 


Zweiter String genzusc lang wie erster ı weiter bei 43142 


Flaqwert fuer ’erster String laenger” 

zweiter String kuerzer: weiter kei 45142 

Laenge des ersten Strings 

Flagawert fuer ’erster String kuerzer” 

Flags fuer Wahrheitswert, falls Strings kis zum letzen 
Zeichen des kuerzeren Strings identisch, jedach 
verschieden 12an9 sind.’ 


Beide Strings Zeichen fuer Zeichen vergleichen 


172 


+ TeIH 


c- Br 


SI BHSIc Vz - - - - - - +1 


RAusfuehrung von “=>, Vergleich zweier Strings (Fortsetzung? 
® 


451595 
45156 
45158 
451608 
45162 
45164 
45166 
45168 
45170 
45171 
45172 
45173 
45175 
45177 
45177 


Verwaltung 


45182 


CLC 
BCC 
LDA 
CMP 
BEQ 
LOS 
BCS 
LD*S 
IN“ 
TA 
FROL 
AND 
BEQ 
LOR 
J’MP 


JSR 


45170 
<1a8),'Y beide Strings zeichenweise vergleichen 
93937 ,Y 
45147 Gleich?” Jar weitermachen .„.. 
#255 Yergleich sbschliessen 
45170 
#1 
18 
45179 
4255 
431938 > Wahrheitswert <a cader —-1> nach FRC bringen 
der Yariaklen 
44797 > CHKCOM prueft auf Komma 


Einsprung fuer BASIC-Rautine DIM 


451835 
451S6 


45189 
45192 
451974 


YARSUC , 


45195 
45197 
452908 
45202 
45204 
45207 
45210 
45212 
45215 
45217 
452193 
45221 
45224 
43226 
45229 
45231 
43232 
45235 
45237 
45240 
45242 
45244 
45246 
435248 
45250 
45252 
452534 
45256 
452593 


TAX 
JSR 


I’SR 
BNE 
RTS3 


LDxs 
JSR 
sT* 
STR 
JSR 
JSR 
BCS 
JMP 
LD* 
ST“ 
ST“ 
ISR 
BCC 
JSR 
BCC 
TAs 
ISR 
BCC 
JSR 
BCS 
CMP 
BNE 
LDR 
STR 
BNE 
CMP 
BNE 
LDA 
BNE 


45202 


121 
45182 


#0 
121 
12 

693 
121 
45331 
45215 
44208 
#0 

13 

14 
115 
45231 
45331 
43242 


115 
43232 
45331 
42232 

#36 
43232 

#255 


naechstes Zeichen 

> Feld dimensicanieren (Name und Groesse werden als 
M“ariskle gelesen und entsprechend dimensioniert)> 

> CHRGOT holt letztes Zeichen 


weitere Dimensionierung? Tas zurueck nach 43182 


sucht Yariakle oder legt zie an 


Flaqgwert fuer fehlende Dimensionierung 
> CHRGQOT halt letztes Zeichen 

Fla9 fuer DIM 

Yariaklenname, erstes Zeichen 

> CHRGOT holt letztes Zeichen 

> prueft, ck Buchstake 

Buchstabe? Ia: weitermachen 

> "SYNTAX ERROR" 


Stringa-Fla3 ruecksetzen 

Integer-Fla93 ruecksetzen 

> CHRGET halt naechstes Zeichen 

Ziffer? Ja: weiter kei 45231 

> erueft, ck Buchstabe 

Buchstaßke? Nein: weiter kei 45242 

zweites Zeichen des Yarisaklennnamens im *R merken 
> CHRGET holt naechstes Zeichen 


Ziffer? Jaı weitere Zeichen lesen 


> prueft, ob Buchstabe 

Buchstabe? Ja: weiter Zeichen lesen 
Code fuer "$"? 

Nein: weiter bei 45232 


Str inga-rFla9 setzen 

Unkedinater Sprung 

Code fuer "=" 

Neins weiter kei 43275 

Integer erlaukt ‘zum Beispiel als FOR-NEXT-Variakble)>? 
Nein: "SYNTAX ERROR" 


173 


c--EBrt 


>44 SHSIc W2Z - - - - - - 


Yerwaltung der Yariaklen (Fortsetzung? 


43268 
45262 
45254 
45256 
452688 
453269 
45271 
45272 
45275 
43277 
45278 
45238 
43282 
45234 


43257 
432393 
452321 
43223 
45295 
43297 
45299 
45301 
45303 
45345 
45307 
43309 
45311 
45313 
45315 
453186 
45318 
45320 
45321 
43322 
45324 
45326 
453283 
45323 


453331 
45333 
45335 
45337 
43338 
453408 


43341 
45342 
45343 
45345 
45347 
45349 
45351 


45332 
45354 
45356 
45358 
45368 
45362 


LDA 
STA 
ORA 
STR 
TA 
ORR 
TAS 
JSR 
sT* 
SEC 
ORA 
SEC 
BNE 
JMP 


LDY 
STY 
LDRA 
LD« 
STK 
STA 
CP 
BNE 
CMP 
BEQ 
LDA 
CMP 
BNE 
LORA 
INY 
CHP 
BEQ 
DE'Y 
CLC 
LDA 
ADC 
BCC 
IN 
BNE 


CMP 
BCC 
SBC 
SEC 
SBC 
RTS 


PLA 
PHRA 
CMP 
BNE 
LOR 
LDY 
RTS 


LDRA 
LD'Y 
CMP 
BNE 
CPY 
BEQ 


#128 
14 
59 
69 


115 
ra 


18 
440 
43287 
43521 


#0 
16 
45 
46 
965 
95 
43 
43307 
47 
45341 
59 


95) ,T 


43321 
va 


957,7 


45445 


35 
#7 
453297 


45235 
455 
45340 
#91 


#165 


Inteser-Flaa setzen 
zur Kennzeichnung als Inteser-Yariable Bit 7 im ersten 
und zweiten Zeichen des Yari=aklennamens setzen 


Bit 7” im zweiten Zeichen des Yariakblennamens setzen 


> CHRGET holt naechstes Zeichen 

Yariaklenname (zweites Zeichen? abspeichern 

Annahme von Feldvariakblen erlaukt? 

Wenn nicht. damn Bit 7 setzen (“Accu kann nicht = 49 sein> 
Code fuer "ii" sukbtrahieren 

= &? Neins weiter hei 45287 

> Bearbeitung von Feldvariaklen 


16) ı= 9 
Yariakblen-Anfangspointer 


als Suchpointer speichern 


Suchpainter = Feldwariaklen-Anfangspointer” 
Nein: weiter kei 45747 


Ja: weiter kei 45341 
Yariaklennasme,. erstes Zeichen 
mit Eintrag vergleichen 
Ungleichs weitersuchen .„.. 
Yarisklenn=zme, zweites Zeichen 


mit Eintrag vergleichen 
Gleich: Yariakble „gefunden, weiter kei 45443 


Suchzeiger 
um 7 erhoehen “Laenge eines Yariakleneintrags> 


lekertras addieren 
als neuen Suchzeiger speichern. zurueck zum Anfang 


Pruefung, ok Rccu einen Buchstakencade enthaelt 
Henn ja, so ist die Carrv-Fla9 gesetzt, 
ansonsten geloescht 


Ruecksprungadresse lcauw der aufrufenden Routine 


Rdresse low kei Rufruf van 4484 

Nein: weiter kei 45352 

Recu/ RI = 48915, Rdresse von Fliesskommazahl @ 
als Variaklenpointer fuer nichtdefinierte Variaklen 
und Systenvariakle TI (Cuval. 43482 FF) 


Yariakblennasme 
erstes Zeichen des Namens = ”7T”? 
Neins weiter kei 45371 


Yariakle ’TI$’? 
Jar weiter kei 45347 


174 


C Pr ©I4 PFEHSIcl zZ - - = - - - 45354 


"erwaltung der Yariaklen (Fortsetzung? 


453864 CPY 473 Yariakle ’T1I”? 

45365 BNE 45371 Nein: weiter bei 45371 

45368 IMP 44808 > "SYNTAX ERROR" <Zuweisung an TI nicht erlaubt) 
45371 CMP #33 erstes Zeichen des Namens = "5"? 

45373 BNE 435379 Nein: weiter bei 45379 

45375 CP'Y 484 statusvariaskle ’ST’? 

45377 BEQ 45368 Jas "SYNTAX ERROR" “Zuweisung an ST nicht erlaukt) 
45379 LDA 47 Felcdvarisakblen-Anfangspointer 

453931 LDY 48 

45383 STA 935 Startadresse fuer Transfer (Quellkbereich)> 
45385 STY 36 

453837 LDRA 49 Yariaklen-Endpointer+1 “Quellbereich) 

45389 LD'Y sa 

45391 STA 9a Endadresse+1 fuer Transfer 

45393 ST’r 91 

45395 CLC Takelle der Arravs muss fuer Yariablenzuwei sung 
45396 ADC #7 um siekern Bytes nach oken verschoben werden 
45398 BCC 45401 

454aA INY llekertrag addieren 

45401 STA 38 Endadresse+1 fuer Zielbereich 

45403 ST'Yr 89 

45405 JSR 41912 > Black-Verschieke-Rautine 

4548 LDA 38 

45410 LDY 89 

45412 IMY 

45413 STR 47 Neuer Feldvarisklen Startpointer 

45415 STY 48 

45417 LDYV #0 Neue Yariakble einkauen 

454193 LDA 83 Variaklenname und Yariablentyp 

45421 5TA 957 ,Y als erste zwei Bytes in 

45423 INY Yariakle aklegen 

45424 LDA ra 

45426 STAA 935) ,Y 

45428 LDA 40 Rest des Yzrisklenwerts mit Nullen auffuellen 
4543@a IN'Y 

45431 STA 95) ,YT 

45433 INY 

454234 STA Im) .Yr 

454365 IN'Y 

45437 STA 99T) ,Y 

45439 INY 

45449 STA IT) ,YV 

45442 INY 

45443 STR 957 .Y 

45445 LOA 95 Accu TR) zeigt auf erstes Byte des Yariakblenwerts 
45447 CLC 

45443 ADC #2 um zwei erhoehen 

45458 LDY 9365 

45452 BCC 4549455 

45454 INY zeigt nun auf erstes Byte des Yarisklenwerts 
45455 5TRA rı als YVariablenzeiger nach (71772) bringen 
45457 STYr r2 

45459 RTS 


175 


BEN 84 RRHSIc zZ - - - - - - 


Laenge Arrav-header zu 


454658 LOA 
454862 ASL 
45463 ADC 
45485 ADC 
45467 LDY 
45469 BCC 
45471 INY 
45472 STA 
45474 STY 
45476 RTS 


45477 144 


45452 ISR 
45435 LDA 
45437 LDY 
45439 RTS 


45499 JISR 
45493 JSR 
45496 ISR 
45499 LDRA 
45501 BMI 


FLPINT 


45503 LDA 
45595 CMP 
45507 BCC 
45503 LDR 
45511 LDY 
45513 JSR 
45516 BNE 
45518 JIMP 


11 


45593 
198 
101 


115 
44446 
44429 

102 
45516 


97 
#144 
45518 
#165 
#177 
48219 
45648 
48283 


95/96 > addieren, ergikt Zeiger auf erstes Feldelement 


Anzahl der Dimensionen 
»nerdaorpeiln (2 Bytes je Dimension? 
plus fuenf BEurtes fuer Frrayheader 


lekertr2a9 addieren 
Ergeknis nach (393.39) 


a Gleitkommadarstellung fuer -I327683 


> FLPINT 


> CHREGET holt naechstes Zeichen 

> FRMEYL wertet Rusdruck auf, Ergeknis in FRC 
> FRMNUM prueft. ck numerische Yariakle 
VYorzeichenbvte var FRC 

Bit 7 gesetzt? Ia: "ILLEGAL QUANTITY ERROR" 


Expanmentbvte von FRAC 
Exponent < 1867 
Jas weiter kei 45518 


Accu YR? = 45477, Startadresse fuer Kanstante -232758 


> Vergleich zwischen FRC und Konstante 
Ungleich? Jas "ILLEGAL QUANTITYT ERROR" 
> Fliesskomma in Inteser-Format kringenr 


Verwaltung von Feldvariablen 


45521 LDA 
45523 ORA 
45325 PHR 
45526 LDA 
45523 PHRA 
45523 LDY 
45531 TYA 
43532 PHR 
45333 LDA 
45535 PHR 
453536 LDA 
455383 PHR 
45539 JSR 
45542 PLA 
45543 STA 
45545 PLA 
45546 STA 
455483 PLA 
45549 TAY 
45559 TSx 
45551 LDA 
45554 PHR 
45555 LDR 
45558 PHR 


12 
14 


123 


0 


ve 


Flas4 fuer DIM 
Integer-Filsa9 “Bit 7 sesetzt, falls Inteser>, 


Fla943 fuer Strinarnumerisch auf Stsck retten 


Zaehler fuer RArzahl Dimensionen, 


VYariaklenname, zweites Zeichen, 

Yarizaklenname, erstes Zeichen auf Stack retten 
> Index-Auswertung “1&-Bit Integer lesen? 
variaklenname, zweites Zeichen, 

Yariaklennsme, erstes Zeichen, 

Zaehler fuer Anzahl Dimensionen vom Stack holen 


Yarisklenflass aus dem Stack kopieren 
und wieder oben auf den Stack legen 


176 


+0 


c-Er 


4 BSrRsSslc W222 - - - - - - 


+5552 


Yerwaltung von Feldvariaklen (Fortsetzung) 


453359 
45561 
45554 
455686 
45569 
45570 
45573 
45375 
45377 
45379 
453982 
45333 
45595 
45536 
45598 
43594 
45592 
45594 
43396 
45599 
45684 
45602 
455804 
456846 
45643 
456518 
45612 
4561:3 
45615 
45617 
45619 
45621 
45523 
45624 
45626 
45627 
456239 
45630 
45631 
43633 
45635 
43637 
45637 
45648 
45542 


456453 
45647 
45649 
45651 
45654 
45656 
45658 
45660 
45682 


45665 
436568 


LDA 
STR 
LOA 
sta 
INY 
ISR 
CMP 
BEO 
STYr 
JSR 
PLA 
sSTA 
PLA 
STA 
AND 
STA 
LD%S 
LDA 
ST* 
STA 
CMP 
BNE 
CP*% 
BEO 
LOW 
LDA 
IN'Y 
CMP 
BNE 
LDR 
CMP 
BEQ 
IN'Y 
LDR 
CLC 
ROC 
TAs 
INY 
LDA 
ADC 
BCC 
LD% 
BIT 
LD*S 
JMP 


108 


253,8 


101 


257,8 


121 
#44 
43531 
11 
447231 


13 


14 
#127 
12 

47 

49 

95 

96 

50 
4565083 
49 
436655 
4a 


95) ,Y 


59 
45623 
va 


95) ,.Y 


45645 


957 ,Y 


95 


95) ,Y 


45637 
43802 


45460 
41992 


Indexbyrtes an Stelle der Yariaklenflays 
auf den Stack legen 


Dimensionszaehler erhoehen 

> CHRGOT halt letztes Zeichen 
Komma <weiterer Index>?7 

Jar zurueck nach 45531 

Anzahl der Dimensionen merken 
> prueft, ob ")" folst 


Flza9g4 fuer String/numerisch, 


Fla4 fuer Integer wiederherstellen 


Feldoar iaklen-RARnfansaspcointer 
als Suchpocinter initisalisieren 


Ende der Feldvariaklen erreicht? 
Nein: weitersuchen ... 


Jas Yariakle nicht gefunden, weiter bei 45665 
Yarisklenname auf RArraxrheader 


mit gesuchtem Yariaklennamen vergleichen 
Ungleich:s weiter kei 45623 

zweites Zeichen des gesuchten Yariskblennamens 
mit Feldvariasklenname vergleichen 

Gleich: Feld gefunden, weiter bei 45643 


sonst Feldlaenge zum Suchzeiger addieren, 
ergibt Pointer auf naechstes Array 


Code fuer "BRD SUBSCRIPT" 


Code fuer "ILLEGAL QUANTITY" 
> Fehlermeldung, READY. 


Code fuer "REDIM’D RERRAY" 

DIM-Flag = 8 <VYariakle gefunden?” 

Nein: "REDIM’OD ARRAY ERROR" 

> 83/839 als Pointer auf erste Felduvariakble 
Dimensionszaehler 


mit Rnzahl an Dimensionen im Arravheader veraleichen 
Ungleichs "BRAD SLIBSCRIPT ERROR" 
> Suche nach richtigem Element des RArravs 


> Laenge des Yarisklenkopfs zum Suchzeiger addieren 
> prueft, ob genug Platz im Speicher 


177 


CP rn 54 ERHZSIC „ZZ - - - - - - 


4 1 


Verwaltung der Feldwariablen “Fartsetzung) 


45671 
45673 
45673 
45577 
4365723 
45651 
456933 
45594 
456353 
45687 
45639 
45591 
43692 
45693 
45695 
45697 
45698 
45699 
43708 
45702 
45704 
45706 
45708 
45714 
45711 
4a712 
45714 
45715 
45716 
45718 
45719 
4S721 
4S722 
45723 
43725 
45728 
45730 
45732 
45734 
45736 
43738 
45748 
43742 
45744 
45745 
45746 
457483 
457508 
45751 
45753 
45756 
45758 
45768 
453762 
45764 
45766 
43768 
457693 
45771 
45773 
45773 


LO 
STYr 
LO 
LDRA 
STR 
BPL 
DE* 
IM'Y 
LDA 
STR 
BPL 
DES 
DE“ 
sT« 
LDA 
IN'Y 
INY 
IN'Y 
STR 
LD*S 
LDA 
BIT 
BYC 
PLA 
CLC 
RDC 
TAX 
PLA 
ADC 
INY 
STR 
INY 
TAR 
sta 
JSR 
ST 
STR 
LD'Y 
DEC 
BNE 
ADC 
BCS 
sta 
TA’ 
TARA 
ADC 
BCC 
IN'Y 
BEQ 
JSR 
STR 
ST'Yr 
LDA 
INC 
LDY 
BEQ 
DEY 
sta 
BNE 
DEC 
DEC 


Ta) 
114 

#5 

69 


953 ,T 


45684 


ra 


953 ,Y 


456593 


95) ,Y 


#11 
#08 

12 
45718 


#i 


#9 


a5) ,Yr 


95>,Y 


45908 


Lszerge eines Elements im Array hei Real 
Yarizklernsme. erstes Zeichen 

in Arr=yvhesder kringen 

Integer? Nein: weiter hei 436834 

kei Integer Anzahl Eytes je Element vermindern 


Variaklenname, zweites Zeichen 

in Arrauheader bringer 

Fliezskomma?” Jar weiter 45693 

sonst Anzahl Buetes je Element um zwei vermindern 


ElemerntizengetFLP: 5, Strinrs: 3, Integer: 2) 
Anzahl der Dimensionen 


in Arrzwheader bringen 
#RRccu)> := il, Ersatzwert bei fehlendem DIM 


Aufruf durch "DIM”? 
Nein: weiter kei 45718 
Vierte der Dimensionierung „om Stack halen 


um eins erhoehen “Feld mit Index 8> 


llekertr 39 =dddieren 


DIM-WMert in Arrayheader bringen 


> kencetigten Speicherplatz fuer Dimensionen? kerechnen 
Speicherkedarf Ic 

Speicherkedarf hiah 

Zeiger auf Arrawheader 

weitere Dimensianen? 

Jar zurueck zum Schleifenkeginr 

Laengae des Feldes zur Anfangsadresse addieren 
185-Bit-Uekerlzauf? Ja: "OUT OF MEMORY ERROR" 


Accu’ VYR? := Endadresse des Feldes 
186-Bit-Uekerlisuf? Ja: "OUT OF MEMORY ERROR" 
> prueft, ob Jgenuga Speicherplatz 

neuen Endezeiger fuer Yariaklen setzen 


Alle Elemente des Feldes mit Nullen vorkesetzen 


178 


c-Br 


>44 PHSICc WW - - - - - - 


u de er re 


rferwaltung der Feldvariaklen <Fortsetzung? 


43777 
45779 
45781 
45782 
35794 
45786 
45788 
45798 
45792 
45793 
35795 
45/97 
43799 
45501 
45302 
45304 
45306 
45308 
51a 
45912 
45913 
45814 
459815 
45817 
45818 
4592a 
45322 
45324 
45326 
45827 
45328 
45830 
45832 


45335 


35338 
45839 
45941 
45343 
45344 
4593958 
45847 
45350 
459352 


45853 


45354 
45355 
45858 
45360 
453862 
458654 
459366 
453553 
4597a 
45972 
45873 
45875 
45977 
45878 
45373 


BNE 
INC 
SEC 
LODA 
SBC 
LOD'Y 
sTA 
LOA 
INY 
SBC 
STR 
LDA 
BNE 
INY 
LODR 
sSTA 
LOR 
STR 
STA 
INY 
PLA 
TAS 
STA 
PLA 
STR 
CHP 
BCE 
BNE 
INY 
TARA 
CMP 
BCC 
J’MP 


IMP 


INY 
LDRA 
ORA 
CLT 
BEQ 
ISR 
TARA 
ADC 
TRAx 
TFA 
LO 
ADC 
sT“ 
DEC 
BNE 
sta 
LDs 
LDA 
BPL 
DE< 
LOR 
BPL 
DEN 
DEX 
stk 


45768 
9 


49 
95 
#2 
95) 
5a 


10a 


ıe1 

95) 
45338 
45932 


95) 
43339 
45637 


114 


‚Yv 


-Y 


‚r 


Endezeiser des Feldes minus 
Zeiger auf Arrayheader eraibt Laerse des Feldes 


in dritte und vierte Position des Arrsvrheaders 
schreiben 


Rufruf durch 
Jaı RTS 
ansonsten Feldelement suchen 
Anzahl an Dimensionen 


"DIM”"-Befehl? 


Feldindex vom Stack halen 


nach (109.101) kringen 


mit durch "DIM” gesetzten Grenzen veraleichern 
Kleiner?” Ja: weiter kei 43938 
sonst: "BRD SUBSCRIPT ERROR" 


ekenso im Falle von Gleichheit der Bytes high die 
Brtes law ueberpruefen 
kleiner? Ta: weiter kei 
> "BAD SUBSCRIPT ERROR" 


+3839 


> "QUT OF MEMORY ERROR" 


Berechnung der Position eines Feldelements 


innerhalb eines Arr aus 


> KAReTR> = 113/11 ECCITFIE) „Y? 


Zeiger in Arrzuhesader 
Zaehler fuer Rnzahl Dimensionen vermindern 


Laenge einer Elements (Real-RArra»> 

Bit 7” im ersten Zeichen des Namens gesetzt (Integer)? 
Neins weiter kei 43873 

Elementliaenge vermindern 

Bit 7” im zweiten Zeichen des Namens gesetzt (FLP?>? 
Jas weiter hei 453379 


Laensge eines Feldelements 


179 


Er 


>44 FSH5Ic Vz u - - - - - + T2Z1 


Yerwaltung der Yariaklen “Fortsetzung? 


45381 LDA 
435333 ITSR 
45836 TAA 
45387 ADC 
4533393 STA 
458591 TYA 
458922 ARD 
455394 STA 
433986 TAY 
453337 LDA 
45339 RTS 


#40 
43909 


83 
De 


89 
v2 


vi 


> Berechnung des Offsetzs des Feldelements 
zur Rodresse des ersten Feldelements addieren 
ergikt Paesitican des gesuchten Elements 


Adresse in Yariaklerpcointer ı(T1rr72) und CAccu"rR> bringen 


18-Bit-Binsermultiplikaticon von <4a.“41) mit (1137/1145). Ersebris nach “KRrrR> 


459009 ST'Yr 
45902 LDRA 
45904 STA 
459965 DEY 
459907 LDR 
45949 STA 
45911 LDA 
45913 5TR 
45915 LOX 
45317 LOD'Y 
45919 TXA 
45920 ASL 
45921 TAX 
45922 TyYA 
45923 ROL 
45924 TAY 
45925 BCS 
45927 ASL 
453923 ROL 
45331 BCC 
45933 CLC 
45934 TSA 
45935 ADC 
453937 TA 
45938 TYA 
45939 ADC 
45941 TA'Y 
45942 BCS 
45944 DEC 
45946 BNE 
45948 RTS 


BASIC-Funktion FRE 


45349 LDR 
45951 BEQ 
45953 JISR 
45956 JSR 
45959 SEC 
45968 LDA 
45962 SBC 
45964 TRY 
45965 LDR 
45967 SBC 


34 


952 ,Y 


49 


95) .Yr 


41 
#16 
23 
#0 
#0 


45335 
113 
114 

45944 


40 


41 


43333 
93 
45919 


13 
45955 
46758 
46374 


S1 
43 


52 
58 


YR merken 
.4ar41) := KIT), TV) 


Bit-Verschiekezaehler 


Eyvtes lIcu und high des Erseknisregisters (CARTR> 
mit Null vorbesetzen 

<XReYR> fuer naechsten Schritt der 
Binsermultiplikation verdoppeln 


VUebkerliauf in Bit 16? 
Jas "OUT OF MEMORY ERROR" 
naechstes Bit aus «“1137/114) herausshitften 


Carry = 0? Izas Addition ueberwehenr: 
SRTYR> = KKRTR> + Karat) 


VUekerlauf bei ARddition? Ias "GUT OF MEMORY ERROR" 
naechstes Bit herausshiften 
alle 16 Bits verschoben? Nein: weitermachen ... 


str ing-Flag gesetzt? 
Nein: weiter kei 45956 
> FRESTR 

> GARBARGE COLLECT 


Yom Str ing-Anfenraspcinter den 


Yariaklen-Endezeiger suktrahieren, 
daraus eraikt sich der freie Speicherplatz 


180 


cEM S4+4 EAS>SIC W222 - - - - - - 452352 


INFLP3: Umaandlung einer 16-Bit-Inteser-Zahl mit Yorzeichen in Gleitkomma 


45969 LDS 
45971 ST 
45973 STR 
45975 STYr 
453977 LD% 
45973 IMP 


BASIC-Funktion POS 


453782 SEC 
459333 JSR 
45786 LOA 
45988 BEQ 


Test auf Direktmadus 


45999 LD*E 
45992 IN“ 
45973 BNE 
45995 LDS 
45997 BIT 
45998 LD“ 
4600aB JIMP 


BRSIC-Rautine DEF 


46003 ISR 
46006 ISR 
48209 JISR 
46812 LDR 
46014 STA 
465016 JSR 
4620193 JISR 
46022 JSR 
46925 LOA 
465927 JISR 


48030 PHR 


46931 LOR 
48033 PHRA 
45034 LOR 
48036 PHR 
46937 LDA 
460339 PHA 
4680849 LDRA 
468042 PHR 
46043 TSR 
4sa4E JMP 


468043 LOA 
45051 JSR 
465054 ORA 
4e0aS6 STA 
46953 JISR 
45061 STA 
46063 ST'r 
4650855 JMP 


#0 

13 

38 

393 
#144 
43196 


63328 
40 
43969 


58 


45399 
#21 


#27 


42037 


465043 
45798 
44794 
#128 
16 
45195 
444293 
44791 
#178 
44799 


122 


43256 
46159 


#165 
44723 
#128 
1& 
45202 
‚8 

‚9 
44429 


Flags fuer String loeschen 
Inteser in (YR’Accu> nach (99799) bringen 


Expcanent := 15 (144 — 128) 
> Fliesskommaszahl in FAC erzeugen 


Flaqwert fuer "Cursorpasiticn lesen” 

> PLOT, Cursaorpcosition lesen, Spalte ins YR 
Erte hiyh lceschen 

Unkedinster Sprung nach INTFLP 


"ILLEGAL DIRECT ERROR"> 


Zeilennummer hiah (CIm Direktmodus = 255) 


Direktmoadus”?” Nein: RTS 
Code fuer "ILLEGAL DIRECT" 


Code fuer "UNDEF”’OE FUNCTION" 
> Fehlermeldung, READY. 


FN-Namen pruefen, FN-Peinter setzer €798.”Y9) 
prueft auf Direktmodus 
rrueft, ob "«" folgt 


VID 


Anrnahme von Inteser- und Feldvarisklen sperren 

> YARSUC sucht Variable oder legt sie an 

> FRANUM prueft, ok numerische Variakle 

> prueft, ob ">" folgt 

BASIC-Code fuer "=" 

> STNCHR prueft, ob dieser Code folgt 

erstes Zeichen des Rusdrucks auf Stack legen Sunwichtig) 
ebenso den Pointer auf die FN-Yariskble 


CHRGET-Pointer (zeigt auf FN-Rusdruck?> 
auf Stack legen 


> DATA, setzt CHRGET-Pointer auf naechstes Trennzeichen 
> Bytes vom Stack in FN-Namensvariakle bringen 


BRSIC-Code fuer ’FN” 
> SYTHCHR prueft, ob dieser Code folst 


Rnnahme von Integer- und Feldvariaklen sperren 
> YARSUC sucht Yariable oder leat sie an 
FN-Pcinter zuf YVariskle setzen 


> FRMNUM prueft, ob numerische Variable 


181 


CBrI &©4 PBR=SIC Vz - - - - - - ISA 


BASIC-Funktion FN 


3sRsg8 ISR 4565049 > FN-Namen pruefen, FN-Pointer setzen (7379) 
46871 LDA 79 Pointer fuer FN-Namen auf Stack legen 

469373 PHRA 

468874 LDA Rg- 

gea7E& PHA 

48077 JSR 447893 > Klammern pruefen. Rusdruck in Klammern auswerten 
46508308 JSR 44429 > FRMNUM prueft, ob numerischer Ausdruck 
4883 FLA 

45034 STA v8 

4ERS6 FLA 

3eEas? STA v9 

480873 LDY #2 

48091 LDA 78) ,Y Zeiger low auf FN-Variable 

46493 STA ri 

468095 TAX 

45495 INY 

468097 LDA 78),Y Zeiger high auf FN-Yariskble = @ (FN-Yariakle wurde erst 
465099 BER 45998 durch FN-ARufruf angelegt? Ja: "UNDEF”D FUNCTION ERROR" 
sg8101 STA ?’2 

45103 INY 

46104 LOR c7/1>D,Y Mert der FN-Yariablen auf Stack retten 

4Es10&6 PHR 

46107 DEY 

46108 BPL 46104 

46110 LDY v2 

465112 JSR 4q48asS4 > FRC runden und in FN-Variakle kringen 
46115 LDA 123 CHRGET-Pointer zuf Stack retten 

46117 PHR 

46118 LDRA 122 

4612A PHA 

48121 LDA .7S),Y CHRGET-Pointer auf Funktionsausdruck setzer 
46123 STA i22 

46125 INY 

4612686 LDA 757 ,Y 

46128 STRA 123 

48138 LDA ?’2 Pointer auf FN-VYariakle auf Stack retten 
46132 PHRA 

46133 LORA rı 

46135 PHA 

46136 JSR 44426 > FRMEYL, FRMNUM, numerischen Rusdruck auswerten 
46139 PLA Pointer auf FN-Yariakle nach (73.79) 

45148 STR 8 

46142 PLA 

46143 STA ‚9 

46145 JSR 121 > CHRGOT holt letztes Zeichen 

45148 BEQ 461533 Trennzeichen? Ja: weiter kei 45153 

468150 IMP 44808 > "SYNTAX ERROR" 


Abschluss der FN-Auswertung 


461353 PLA CHRGET-Pointer wiederherstellen 
46154 STA 122 

461356 PLA 

46157 STA 123 

46159 LDY #0 alten Wert der FN-Yariaklen wiederherstellen 
4siel PLA 

46162 STA (78) ,Y 

46164 PLA 

451635 INY 

4E166 STA 73) ,Y 

4E168 PLA 


182 


cPHMI 54 FErHMSIc zZ - - - - - - 


4152 


BASIC-Funktion FN <Fortsetzung? 


46169 
46170 
46172 
46173 
46174 
46176 
46177 
46178 
46180 


INY 
sta 
PLA 
INY 
STA 
PLA 
IN’ 
STR 
RTS 


73) ,Y 


75) ,T 


79) .,Y 


BASIC-Funktion STR$ 


46181 
46194 
45186 
46139 
451970 
45191 
45173 
46195 


Speicherplatz pruefen, 


46197 
45199 
48201 
46203 
46205 
48208 
46210 
46212 
4s21d4 


JSR 
LD'Yr 
ISR 
PLA 
PLA 
LOA 
LD'Y 
BEQ 


LD« 
LDY 
ST* 
ST'r 
JSR 
ST» 
sTYr 
sTA 
RTS 


44429 
#0 
486097 


String lesen und 


45215 
468217 
46219 
4s221 
46223 
462253 
46227 
465229 
4s231 
46232 
46234 
45236 
46232 
468240 
48242 
46244 
46246 
46248 
46249 
46251 
46252 
46254 
46256 
46.2533 
46260 
46261 


LDX 
STK 
STK 
STA 
STY 
STA 
STY 
LDY 
INY 
LDA 
BER 
CMP 
BEQ 
CMP 
BNE 
CMP 
BEQ 
CLC 
STY 
TYA 
ADC 
STA 
LOX 
BCC 
INK 
STK 


> FRMHNUM prueft, ob numerische Yariskle 

> FACSTR erzeugt String aus FRC ab (2557 
Ruecksprungadresse in Funktionsauswer tung 
vom Stack entfernen 

<Accu/tR) :ı= 255. Startadresse des Strings 
Unkedinater Sprung 

Stringpointer setzen 

-10a7’101) 


zeiat auf Stringdescriptor 


> Speicherplatz pruefen, String-Anfangspointer setzen 
Startadresse des Strings nach 798799) 


Laerge nach (97) 


in Strirgbkereich transferieren 


#34 Code fuer Anfuehrungszeichen nach <7> und (8) 
r4 
3 
111 Startadresse des Strings nach «1117112> und 98799) 
112 
93 
393 
#253 Pointer auf String initialisieren 
<111>,Y Endezeichen? 
46248 Ja: weiter bei 45248 
v 
462744 
8 
45231 
#34 
45249 
97 Strinralaenge 
111 zur Anfanasadresse des Strings addieren 
113 ergibt Endadresse+1 des Strings 
112 Vebkertra93 addieren 
46261 
i14 


183 


CP 54 BrS>SIcl zZ - - - 


String lesen und in Stringbereich transferieren 


Fortsetzung? 


48263 LDA 112 Start=zdresse high 

465265 BEQ 46271 = a? Ja: weiter bei Jde2Y’1 

4es267 CMP #2 = 2? j 

46269 BNE 45232 Nein: weiter kei 45232 

45271 TYA Str inglaenge 

4s272 JSR 46197 > Speicherplatz pruefen, Stringpointer setzen 
46275 LDXS ı111i Anfangsadresse des Strings in (111/112) 

46277 LDY 112 

46279 ISR 46728 > Strina in cberen Stringbereich transferieren 
45232 LOX 2 Descrirtor-Index fuer Tsbelle “2I-...,.33)9 
46284 CPX #34 Tabelle voll? 

462386 BNE 45293 Nein: weiter bei 46293 

468298 LDX #25 Code fuer "FORMULAR TOO COMPLE«" 

46230 JMP 42039 > Fehlermeldung, READY. 

45293 LOA 97 Stringdescriptor “Laerge; Startacdresse lau, Kiah>) 
462935 STAA a.r% in Descriertortakelle bringen 

46297 LDA 938 

46299 5TA 1,3% 

46301 LDA 393 

46363 STA 2,8 

468305 LDY #0 CHR/TYR> := Pcinter auf Descrietor in Tabelle (25,...,23) 
468347 STA aa c1aB’101) := CKR/TR) (CPceinter auf Descriptor) 
465309 STY 101 

46311 STY 112 112) ı= QA 

46313 DEY 

468314 STY 123 strinaflay setzen 

46316 STR e3 Zeiger auf letzten Descrirtor setzen 

45318 IN“ 

46313 INS 

46320 INX 

46321 STx 22 Descrietor-Index um drei erhcaehen 

46.323 RTS 

48324 LSR 15 Fla943 fuer Garkage Collect ruecksetzen 

46326 PHA Stringlaenge retten 

46327 EOR #255 Str ing-Anfangspointer (351.32) 

45329 SEC um Stringalaenge vermindern 

4683308 ADC 51 

46332 LDY 52 

46334 BCS 46337 

46336 DE'Y 

46337 CPY sa Ist Str ing-Anfangzeiger kleiner als Zeiger 
46339 BCC 45359 auf Ende der Yariablentskelle? Ja: weiter bei 48358 
46341 BNE 46347 

46343 CMP 49 

46345 BCC 46358 

46347 STAR 51 Zeiger als neuen Stringanfanaspointer setzen 
465349 STY 52 

46351 STR 53 

46353 5TYr 54 

46355 TAX 

463356 PLA stringlaenge wieder vom Stack haler 

46357 RTS 

46355 LDX #16 Code fuer "OUT OF MEMORY" 

463689 LDRA 15 Garbage Collect kereits ausgefuehrt? 

46362 BMI 46290 Jas "OUT OF MEMORY ERROR" 

46364 JISR 46374 > GARBRAGE COLLECT 

46367 LDA #128 

46369 STR 15 Flaus fuer Garkage Collect setzen 

46371 PLA Stringlaenge wieder vom Stack holen 

46372 BNE 465326 Nochmals Einkau des Strings wersuchenr 


184 


ce SI4 BHSIcl w'Z - - - - - = 


GARBAGE COLLECT, 


46374 
46376 
46378 
46338 
46382 
463934 
46336 
46383 
46390 
46392 
46394 
46396 
463385 
46400 
46402 
454094 
46406 
468403 
asdı] 


46413 
46415 
46417 
46419 
46421 
46423 
46425 
46427 
464 .2 
46.31 
46433 
46436 


46438 
46448 
46442 
46444 
46446 
464483 
46450 
46452 
46454 
46456 
46458 


4ög461 
46453 
45455 
46467 
46469 
46470 
45471 
46473 
45474 
46475 
46477 
45479 
46451 
45432 
464534 
46456 


LOS 
LDRA 
ST* 
STRA 
LOY 
sTYv 
STYr 
LODA 
LD* 
STA 
ST* 
LDA 
LD*S 
st“ 
ST 
HP 
BED 
JSR 
BEQ 


LOA 
STA 
LOA 
LOX 
STR 
sT* 
CPX 
BNE 
CHP 
BEQ 
JSR 
BEQ 


STR 
sT« 
LOR 
STA 
LDA 
LD«s 
CP“ 
BNE 
CHMP 
BNE 
JMP 


STA 
sT* 
LD'Y 
LOR 
TA»s 
IN'Y 
LDA 
PHP 
IN'Y 
LDA 
ADE 
STA 
INY 
LDA 
ADC 
sTtA 


59 
565 
51 
52 
4a 


46413 
46535 
46404 


#7 
83 
45 
46 
34 
35 
48 
46433 
47 
46438 
46323 
46425 


34) 


34) 


34) 


85 


‚Vv 


‚v 


‚Y 


45.2374 


Stringmuellkeseitigung 


Pointer auf Ende Arbeitsspeicher 


als Str ing-Anfangspeinter setzen 


variabklen-Endepainter 
nach 9597985) bringen 

Startadresse der Descriptarentskelle (25,...,33> 
als Suchpointer nach <34.35> kringen 

identisch mit Pointer auf letzten String 

Jas weiter kei 46413 


> Position des String feststellen, 
Unbedinater Sprung 


494. Pointer setzen 


Schrittueite fuer Suche in Yariskblentakbelle 
Pointer auf Yariaklentakelle 


als Suchpointer nach 134.35) bringen 


Ende der Yariaklentabkelle erreicht? 
Nein:s weiter kei 46433 


sanst zu Arraxw-Behandlung uebergehen 
> Position des Strings feststellen, 99f. 
Unkedinater Sprung 


Pointer setzen 


Pointer in Arrauwtsbelle 


Schrittweite fuer Suche innnerhalbk eines Arrays 


Ende der Arrazwtakbkelle erreicht”? 
Nein: weiter kei 4461 

> sonst Transfer 

Pointer auf Arraw, header 
Yarisklenname, erstes Zeichen 
in XR vebertrasen 


Yariablenname, zweites Zeichen 
Statusflags merken 


Laenge des Arrays zu Pointer auf Arraytakelle sddieren 


185 


cEn ©&©4 BASIC vw - - - - - - 


GARBAGE COLLECT Fortsetzung? 


46488 
46489 
46491 
46492 
46494 
46495 
46497 
46499 
465908 
46502 
46504 
45306 
46505 
46510 
45512 
46514 
465516 
46518 
46520 
46523 


46525 
46527 
46529 
46330 
46532 
46534 
465335 
46537 
463393 
46344 
46542 
46543 
46544 
46546 
46543 
46558 
46552 
46554 
46556 
46558 
46568 
46562 
46564 
46566 
46568 
46570 
46572 
46574 
46576 
46578 
46588 
46582 
46584 
46585 
46587 
46589 
46591 
46593 
46595 
46597 


PLP 
BPL 
TARA 
BMI 
IN'Y 
LDA 
LD'Y 
ASL 
ADC 
RDC 
STR 
BCC 
INC 
LD%* 
CP® 
BNE 
CMP 
BEQ 
JSR 
BEQ 


LDA 
BMI 
INY 
LDR 
BPL 
INY 
LDR 
BEQO 
IN’ 
LDR 
TRAS 
INY 
LDR 
CMP 
BCC 
BNE 
CPx 
BCS 


CMP 


BCC 
BNE 
CP* 
BCC 
sts 
STR 
LDA 
LDS 
sTR 
STx 
LOR 
STA 
LDR 
cLC 
RDC 
sTA 
BCC 
INC 
LD* 
LD'Y 
RTS 


46446 


46446 


345 ,YV 
465832 


34) ,Y 
46532 


34) ,'Y 
46532 


34 
34 
46593 
35 
35 
#8 


Stringvariakle? Nein: weitersuchen ... 


String,sariskle?” Neins weitersuchen ... 
Anzahl Dimensionen 
mal 2 «zwei Ryrte je Dimensian) 


plus 5 “Arraxsheader> 
zum Pcinter addieren 


Pcinter in Array, 
mit Pointer auf naechstes Feld vergleichen 
Ungleich? Ja: weiter hei 46524 


Feld 
9947. Pointer 


Gleich?” Jas weiter mit naechstem 
> Position des Strings feststellen, 
UInkedingter Sprung 


Yariaklenname, erstes Zeichen 
Integer kzw. Function?” Jar weiter 45532 


Yarisklenname, zweites Zeichen 


eic. 
Real? Ja: weiter bei 46532 


Stringlaenge 
= 8? Ja: weiter kei 46532 


Startadresse des Strings nach “ER’Rccu) 
mit <S1.52)> 


Str ingpointer neraleichenr 


Groesser”?” Ja: weiter kei 46582 


Stringspointer mit 9536) veraleichen 


Kleiner? Jas weiter hei 465332 


Startadresse des Strings nach (9595) kringen 
Adresse des Stringadescriptors 

nach (78/79) kringen 

Schrittweite fuer Suche in Yariaklentabelle 


zum Suchpointer addieren 
und wieder nach (34.735> bringen 


Accu/XR) ı= (34,35) 
fuer unbkedingten Sprung 


186 


setzen 


cEr1 


GARBAGE COLLECT CFortsetzung? 


465398 
46608 
456802 
466094 
48.608 
468083 
45603 
46610 
48612 
46614 
46516 
46618 
46620 
46622 
46624 
46625 
466283 
46630 
46632 
466.39 
46637 
46633 
46640 
46642 
46643 
46645 
46647 
468548 
46650 


LOR 
ORRA 
BEO 


SS erSlIc VvZ Mm = u AR re u 13.595 
Strirg zwischen Yarisaklentakellenende 
und oakerem RANM-Ernde sefunden? 
Nein: fertig, RTS 
Falls Suchlauf in Arrav-Suchlauf, sa ist (357 = 3, 


oA 
AND 
LSR 
TAY 
STA 
LOR 
RDC 
sta 
LOR 
ADC 
STA 
LDRA 
LOS 
STAÄ 
ST* 
ISR 
LDY 
INY 
LDA 
STA 
TAs 
INC 
LDA 
IN'Y 
STR 
JMP 


7S; 
46373 


sonst ist (89) = 7 


Y’R ist Z bei Einzelvariakble, &ü bei Array 
Laenge des Strings 
zur Anfzargsadresse low des Strinas addieren 


ersikt Endadresse+1 low des Strings 


ekensoa Endadresse+1 hiah berechnen 
Endadresse des Zielkereichs fuer Transfer 


> Black-Verschieke-Rautine 


» 


neue Anfangsadresse low 
in Descriptor bringen 
neue Anfanssadresse hiah 


in Descriptor bringen 
> weitermachen, bis alle Strings kearkeitet wurden 


BARSIC-Routine zur Str-ingverknuepfunga (+) 


46653 
46639 
4668365 
48638 
46639 
46662 
46565 
466686 
46688 
46669 
46671 
46673 
46675 
4656876 
46678 
46630 
46682 


46685 
46638 
46691 
46693 
46695 
46698 
46’01 
46703 
46705 
46708 
46711 


LDRA 
PHR 
LODA 
PHA 
I’SR 
JISR 
PLA 
STR 
PLA 
sSTA 
LO 
LOA 
CLC 
ADC 
BCC 
LDS 
JMP 


JSR 
JSR 
LDR 
LDY 
JSR 
JSR 
LDA 
LO'Y 
JSR 
JSR 
JMP 


101 


198 


44675 
44431 


111 


112 
#0 
111 


100 
46685 
#23 
42939 


45197 
465714 
ga 

Si 
46782 
46732 
111 
112 
46762 
46282 
44472 


>.,Y 


I,YV 


Pointer auf Descriptor des ersten Strings 
auf dem Stack zwischenspeichern 


> Adresse des zweiten Stringdescriptors nach <18a/’1091> 
> FRHMNUM prueft, ck Strinwwariakble 

Pointer auf Descrieptor des ersten Strings 
wiederherstellen 


Lsaense des ersten Strings 


plus Laenge des zweiten Strings 
Kleiner als. 256? Jar weiter kei 46685 
Code fuer "STRING TOO LONG" 

> Fehlermeldung, READY. 


> Speicher pruefen, Platz fuer Gesamtstring reservieren 
> ersten String in reser»ierten Bereich kringen 

Peinter auf Descriptor.des. zweiten Strings 

kwird bei Rufruf von 46197 ,mach (S8’8T>7 gebracht) 

> FRESTR 

> zweiten String an ersten 
Fointer auf Descrietor des 


String anhaengen 
ersten Strings 


> FRESTR 


> Descriptor in Tabelle nach (25,...,33) 
> zurueck in Ruswertung von Ausdruecken 


187 


CB S5:S+ BRSIC WZ - - - - - = 4,14 


BASIC-Routine zur Str ingverknuepfung C+) 


4s7/id4 LOY #0 Ei 
457/16 LOR ce1l11>.,Y Stringalaenge auf Stack retten 

46713 PHRA 

46719 INY 

46720 LDRA <iti11>,Y ARnfanssadresse lou des Strings ins XR 

4E722 TAS 

468723 INY 

48724 LOA el1l1l>.Y Anfznasadresse high des Strings ins TR 

4öY26 TAY 


46727 PLA Strinalaenge wieder holen 

48728 STX 34 Adresse lau ö 

46730 STY 33 Adresse hiah 

46732 TAT Laenge = 8? 

46733 BEQ 46745 Ja: weiter kei 46795 

46735 PHRA 

46736 DEY 

46737 LDA 3493 ,Y7 string in Bereich, zuf den «33.7945 zeiat uekertragen 
45739 STA 337 ,Y 

46741 TA 

46742 BNE 467365 

46744 PLA Str inglaenge 

46745 CLC Pointer (537545 um Strinalaenge erhoehen 
468746 ADC 53 

45743 STR 53 

468750 BCC 2 4gEräd 

46752 INC 54 

46754 RTS 


FRESTRıs Str ingverwaltungsroutine 


46755 JSR 44431 > FRMNUM erueft, ok Stringvariable 

46758 LDA 1090 <1AaB87/101) zeiat auf Stringdescriptor 

46760 LDY 101 

46762 STA . 34 nach <34.’35) kringen 

46764 STY 35 

468766 JISR d6Esıl > prueft,. ok identisch mit letztem String 
45769 PHP Statusflass merken 

4sYYva LDY #0 

46772 LDA 34) ,YV strinalaenge auf Stack retten 

46774 PHA 

46773 INY 

468776 LDA 34) ,Y Rnfangsadresse low des String ins KR 

46778 TAX 

46779 INY 

46730 LDRA 34) ,Y Anfangsadresse hiah des Strings ins YR 
46782 TAY 

46783 PLA stringlaenge wieder halen 

46794 PLP neuer String identisch mit altem String? 
46785 BNE 46396 Nein: Anfangsadresse des Strings nach (34735), RTS 
46787 CPY s2 neue Stringadresse mit identisch mit Pointer auf 
46789 BNE 46906 unteres Stringende? Nein: weiter bei 4J6306 
46791 CPX : 51 

46793 BNE 46806 

46795 PHR str ing-Anfanaspointer um Laense des Strings 
46796 CLC hinaufsetzen 

46797 ADC 51 

46799 STR 51 

469301 BCC 46805 

46803 INC 32 


188 


cBr 


FRESTR: Str inaverwalitungsroutine “Fortsetzung? 


45805 PLR 
46306 STX 
465308 ST'r 
4631a RTS 


463811 CP'Y 
45813 BNE 
45815 CMP 
46817 BNE 
46519 STA 
46821 SBC 
46323 STR 
46325 LD'Y 
45827 RTS 


34 
35 


24 
46827 
3 
4&327 
22 
#3 
23 


#0 


BASIC-Funktion CHR$ 


46523 ISR 
46331 TAR 
48332 PHR 
46333 LDR 
46835 JSR 
4638398 PLA 
46837 LDY 
46841 STA 
46343 PLA 
469844 PLA 
48345 IMP 


BASIC-Funkticon LEFT$ 


45343 JISR 
46351 CMP 
46353 TYA 
459354 BCC 
46356 LDA 
4593598 TA» 
45357 TYR 
46360 PHRA 
45961 TAR 
45362 PHA 
455653 JSR 
482388 LDA 
468368 LOW 
46370 ISR 


45373 PLR' 


46874 TAT 
463753 PLA 
48876 CLC 
46877 ADC 
468379 STA 
46881 BCC 
463833 INC 
46355 TYA 
465336 ISR 
465339 JMP 


47a093 


45203 
30 
siı 

46762 


34 
24 
45385 
35 


4E732 
dgazs2 


5: Pernrsiıcl W222 z en “ = = = +45 53095 
Stringlaenge 
Startsdresse low 
Startadresse hiah 
neuer Pceinter zauf Stringdescriptor in (Accu/YR> 
identisch mit <23724>? Nein: RTS 
neuen Pointer nach (227, 
c23> um drei vermindern “Carry ist bereits 1) 
> GETBYT holt folgenden Wert ins *R 
Brte merken 
Stringalaenge auf 1 setzen 
> Speicher pruefen. Platz reservieren 
Brte als Element des Strings speichern 
Ruecksprungadresse aus Stack entfernen 
> Stringdescrirtor in Tabelle (2S,...,33> kringen 


> Stringadreszse und Parameter vom Stack halen 
Parameter fuer LEFT$ mit Stringalaenge vergleichen 
Accu) ı= 0 

Parameter kleiner Stringlaenge? Iaı weiter kei 46960 
Stringlaenge ins XR 


Accu) = A 
Position des ersten Elements des neuen Strings 
Strinalaengse kzuw. Parameter fuer LEFT$ 


> Speicher pruefen, Platz reservieren 
ga/’gs1> ist Pointer auf Stringdescriptor 


> FRESTR 


Laense des neuen Strinas - 
Position des neuen Elements “kei LEFT$ = 8) 
Adresse des alten Strings entsprechend erhoehen 


Laenge des neuen Strings 
> neuen String in Strirgkereich vebkertrasen 
> Stringdescriptor in Tabelle (25,....,33 bringen 


189 


CB S4 BASIC w2zZ - - - = - - 


BRSIC-Funktion RIGHTF$ 


46392 ISR 46945 
45395 CLC 

46895 SBC 30) „'Yr 
46898 EOR #255 
4saaa IMP 46854 


BRSIC-Funktion MID$ 


46993 LOA #255 
46985 STR 121 
465947 ISR 121 
45910 CMP #41 
46912 BEQ 46920 
46914 JSR 44737 
46917 JSR 47008 
46920 JSR 46945 
465923 BEQ 47aga 
46925 DES 

46925 TAA 

46927 FHR 

46928 CLC 

469293 LDX #0 
46931 SBC 80) ,Y 
46933 BCS 468561 
465935 EOR #255 
46937 CMP ıi01 
46933 BCC 46862 
46941 LDA 181 
465943 BCS 46962 
45945 JSR 44791 
46948 PLA 

46949 TAY 

469598 PLA 

46951 STA 83 
46953 PLA 

45954 PLA 

46955 PLA 

46956 TAX 

46957 PLA 

46958 STR sa 
4696A PLA 

46961 STA 1 
46963 LDA 35 
46365 PHR 

469365 TYA 

46967 PHR 

46968 LDY #0 
46978 TXA 

46971 RTS 


BASIC-Funktion LEN 


46972 JSR 46978 
46975 JMP 45986 
46978 JISR 46755 
46981 LDX #0 
46983 STX 13 
469385 TAY 

468986 RTS 


4.92 


> Stringadresse und Parameter halen 

zweiten Parameter von Stringlaenge sukbtrahieren 
(umgekehrt durch Vorzeichenumkehr)> 

Accu enthaelt Nummer des ersten Elements 

> weiter wie kei LEFT#$ 


Ersatzwert fuer zweiten Zshlenparsmeter 


> CHRGOGOT holt letztes Zeichen 

Code fuer ">"? 

Jar kein zweiter Parameter. weiter bei 46924 

> CHKCOM prueft, cb Komma folgt 

> GETBYT bringst zweiten Parameter nach “1a1l> 

> Stringadresse und zweiten Parameter holen 
erster Parameter = a? Jar "ILLEGRL QUANTITY ERROR" 


Positian des ersten Elementz inmerhalk 
des alten Strings zuf den Stack aklegen 


Laenge des alten Strinas kleiner als erster Parameter”? 
Ja: restliche Ausfuehruna bei LEFT# 
neue Stringlaenge berechnen 

kleiner als zweiter Parameter? 

Jas restliche Ausfuehrung bei LEFT$ 
sanst zweiten Parameter als rechte” 
Inbedingter Sprung 


Str ingkegrenzund 


> prueft, ck ">" folgt 
Ruecksprungadresse low, 
Ruecksprungadresse hish der aufrufenden Routine 
low, 


hiah 


Ruecksprungadresse 
Ruecksprungadresse non JSR 84 «45a24) 
erster Parameter . 

Rdresse des Stringdescriptors aus Stack 
nach (80.'931> bringen 


Ruecksprungadresse der aufrufenden Rautine 
wieder auf den Stack lesen 


Index <Imdirect-Adressierung? := 8 


erster Parsmeter 


> FRESTR, String-Flas loeschen 
> Rccu) ı= 8, INTFLP 
> FRESTR 


Str ins-Fla9 loescher 
Stringlaenge ins YR 


1% 


cBr ©4 EBERSIC 


BRSIC-Funktion ASC 


46937 JSR 
46998 BEQ 
46992 LDY 
46994 LDRA 
46996 TRY 
46997 JMP 
47202 JMP 


GETBYT: 


47003 JSR 


470806 ISR 


47099 JSR 
47’al2 LD« 


478014 BNE 


4’ale6 LDES 


47018 JMP- 


46973 
47900 
#0 
234) ,Y 


4+3956 
45648 


115 
44426 
45496 

188 
47208 

101 

121 


BRSIC-Funktion WAL 


ara21 JSR 
47024 BNE 


4726 JMP- 


47029 LD* 
4’a31 LDY 
47033 ST 
47335 STYr 
47037 LO“ 
47439 ST*S 
47341 CLC 
arag2 ADC 
47844 STA 
470456 LD*S 
47843 ST 
4’o5a BCC 
47852 IN“ 
47053 STAA 
47055 LDYV 
4’a57 LDA 


47053 PHR- 
47088 TYA- 


araeı 5TA 
47063 JSR 
47066 JISR 
47869 PLA 
4’a78 LOY 
47072 STR 
4’a74 LDX 
47076 LOüY 
47078 STA 
47880 ST'r 
4’a82 RTS 


46973 
47023 
47331 


122 
123 
113 
114 

34 
122 


34 

365 

35 
123 
47053 


37 
#40 
36),YV 


36) ,Y 
121 
43371 


40 
36) .,Y 
113 
114 
122 
123 


> FRESTR, 
Stringlaerge = B? Jas 


Strina-Flas lceschen 
"TLLEGAL QLIANTITY ERROR" 


erstes Zeichen des Strings 


> «Recu? ı= 8, INTFLP 
> "ILLEGAL QURNTIT'Y ERROR" 


liesst Zahl im Bereich van @a bis 253 zus BASIC Text ins XR 


> CHRGET holt naechstes Zeichen 

> FRMNUM,. FRMEYL numerischen Ausdruck auswerten 

> FLPINT, falls negativ "ILLEGAL QUANTITY ERROR" 

Byte hiah des Yehoiten Rusdrucks = 8? 

Nein: Wert aroesser als 255, "ILLEGAL QUANTITY ERROR" 
Byte lou des seholten Rusdruck ins XR 

> CHRGOT holt letztes Zeichen 


> FRESTR, Strina-Fl293 loeschenr 
Stringlsenge = 8? Nein: weiter kei 47929 
> FRC :ı= 8, fertig 


CHRGET-Pointer 
in <11237/114) zufbeuwahren 


Str ing-Anfangsadresse 
in CHRGET-Pointer bringen 


Adresse des ersten Zeichens nach dem String 
nach (386737> bringen 


erstes Byte nach dem String 
auf dem Stack zwischenspeichern 


und durch Null <als Trennungszeichen? ersetzen 
> erstes Zeichen des Strings holen 


> String in Fliesskommazahl nach FRC bringen 
erstes Bvte nsch dem String wiederherstellen 


CHRGET-Pointer wiederherstellen 


GETRDR und GETBYT: Lesen einer Adresse und eines Bytes 


470933 JSR 
47036 JSR 
478989 ISR 
47’a92 JIMP 


44426 
47995 
44797 
47006 


> FRMEYL, FRMNUM wertet numerischen Rusdruck aus 
> GETRDR bringt Adresse aus FRAC nach (209021) 

> CHKCOM prueft, cb Komma folgt 

> GETBEYT holt Byte ins XR 


191 


452337 


ed — I 12 


>44 SHSIC 


we - - - - = - + "9275 


GETRODR: Lesen einer Adresse im Bereich »von @ kis 65535 


47095 
47097 
470993 
47101 
47103 
47105 
47108 
47118 
47112 
47114 
471165 


BRASIC-Funktion PEEK 


47117 
47113 
47120 
47122 
47123 
47126 
47128 
47130 
47131 
47132 
ar134 
47135 
47137 


BRSIC-Routine POKE 


47140 
47143 
47144 
47146 
47143 


BASIC-Routine WAIT 


47149 
47152 
47154 
47156 
47159 
47161 
47164 
47166 
47168 
471709 
47172 
47174 
47176 


LDA 
BMI 
LDA 
CMP 
BCS 
JSR 
LDA 
LDY 
STYr 
STA 
RTS 


LDR 
PHR 
LDA 
PHRA 
JSR 
LD'Y 
LDA 
TAY 
PLR 
STAR 
PLA 
STA 
IMP 


JSR 
TR 
LD'Y 
STR 
RTS 


JSR 
sT« 
LD* 
JSR 
BEO 
ISR 
STK 
LDY 
LDR 
EOR 
AND 
BEQ 
RTS 


1092 
47008 


21 


28 


el 


45936 


47083 


40 


20) .'r 


47033 
v3 

#0 
121 
47/164 
47039 
4 

#0 


20) ,'Y 


74 
73 
47168 


Arithmetik: FRC : 


47177 
47179 


LDA 
LD'Y 


#17 
#191 


47181 JMP 47207 


“orzeichen van FRC . 

negativ? JIas "ILLEGAL QUANTITY ERROR" 

Exponentkyte von FRC 

gsroesser 16 «145 — 123 = 17 

Jas "ILLEGAL QUANTITTY ERROR" 

> GK-Zahl in 16-Bit-Integerzahl oahrıe Yarzeichen umwandelr: 
Adressbyteser vertauschen 


und nach -29.’21> kringer 


20.’21) auf Stack retten, falls (20.213 won 


aufrufender Rautine nach benaetiat wird (z. B. POKE> 


> GETROR krinst PEEK-Adresse nach .“29721> 
Inhalt der PEEK-Rdresse ins YR 
c2a,.’21> wiederherstellen 


> «Rccu> := @, INTFLP 


> GETROR. GETBYT 
Byte (zweiter Parameter) 


in POKE-Adresse speichern 


> GETROR, GETBYT 

zweiter WAIT-Parameter nach (73? 
Ersatzwert fuer dritten WHIAIT-Parameter 

> CHRGOT holt letztes Zeichen 

folst Trennzeichen? Ja: weiter kei 47164 
> CHKCOM, GETEYT 

dritter WAIT-Parameter nach (74) 


Inhalt der WAIT-Adresse 
EXDOR mit drittem Parameter 
AND mit zweitem Parameter 
Ergeknis = 8? warten ... 

+ FRC 

<Accu/YR? := 48913 


> FRC ı= FLP-Koanstante + FRC 


192 


cBEnN S4+ PFBRHSIcC WW - - - - - - 471254 


Aarithmetik: FAC ı= ARG —- FRAC 


47184 ISR 497756 > Konstante, auf die (Accw’YR) zeigt, nach ARG 
47187 LDRA 102 Vorzeichen von FRAC invertieren 

47189 EOR #255 

47191 STA 102 

471933 EOR 11@ und mit Vorzeichen von FRC verknuepfen 

47195 STAA 111 Ergebnis nach (111> 

471397 LDRA 37 Expanent „on FAC “falls FAC = 8) 

47193 JIMP 472108 > FRC ı= ARG + FRC 


Aithmetik: FRC := ARG + FRC 


47202 ISR 47513 > Exponenten von FRC und ARG einander anpassen 
47205 BCC 47267 Unkedingter Sprung 

47207 ISR 47756 > Konstante, auf die (Accu YR) zeigt, nach RARG 
47210 BNE 47215 FRC = 0? Nein: weiter kei 47217 

47212 IMP 48124 > FRC := ARG 

47215 LOS 112 Rundungkyvte fuer FRC 

47217 ST“ SE nach 86> kringen 

47212 LD# #105 KR als Offset-Pcinter fuer ARG laden 

4/2221 LODA 195 Expcanent-Bvte var ARG 

47223 TAY 

47224 BEQ 47176 ARRG = a? Ja: RTS 

472268 SEC 

47227 SBC 37 Exponentkyvte „san FRC suktrahieren 

47223 BEQ 47267 Exponenten gleich? Ja: weiter bei 47267 

47231 BCC 47251 Expanent „van FRC groesser? Taı weiter kei 47267 
47233 STY 97 Expanent van FRC durch Vorzeichen won ARG ersetzen 
47235 LDY ı1a “arzeichen van FRC durch Yarzeichen von ARG ersetzen 
47237 STV 182 

47232 EOR #255 Vorzeichen der Expanentendifferenz wechseln 
47241 RDC #0 ‘Carry = 1) 

47243 LDY #0 

47245 STY 8s& Rundungsstelle loeschen 

47247 LOX #37 “«R als Offset-Pointer fuer FRC laden 

47249 BNE 47255 Inkedinster Sprung 

47251 LDY #0 

47253 STTr 112 Rundungsstelle warn FRAC loeschen 

47255 CMP #243 Differenz der Exponentern sroesser 7? 

47257 BMI 4d7’2a2 Ja: Mantissen aneinander anpassen 

37259 TA'Y 

4’2e80 LODOA 112 Rundungastelle van FRC 

47262 LSR 1, 

47254 ITSR 47536 > Angsleichen durch Verschieben der Mantisse 
47267 BIT 111 Vorzeichen von FRC und ARG identisch 

47269 BPL 47358 Ja: Addition der Mantissen, weiter bei 47358 
47271 LDYV #97 YR als Offset-Pointer fuer FRC laden 

47273 CP* 4105 Ist &R als Offsetzeiger fuer RARG initialisiert? 
47275 BEOQO 47279 Ja: weiter kei 47279 
4/7277 LDY #105 YR als Offset-Pointer fuer ARG laden 

47279 SEC Mantissensuktr aktion 

47280 EOR #253 

47232 ADC SE Rundungsstelle 

47284 STA 112 

472886 LDA 4,Y 

47289 SBC 4," 

472931 STA 101 

47233 LDA 3,Y 

47296 SBC 3,8 

47238 STA ag 


193 


CEri 


Arithmetik: FAC := ARRG + FRC (CFortsetzung) 


47306 
47303 
47305 
47397 
47318 
47312 
47314 
47316 


47319 
47321 
47322 
47323 
47325 
47327 
47329 
47331 
47333 
47335 
47337 
47339 
47341 
47343 
47345 
47347 
47349 
47351 
47353 
47355 
47357 


Mantissenacddition bei 


47358 
47360 
47362 
47364 
47366 
47368 
47370 
47372 
47374 
47376 
47378 
473890 
47332 
47394 
473896 


47389 
47391 
47393 
47395 
47397 
47339 
47401 
47403 
47494 
474086 
47408 
47410 


86 
112 
101 


78 
47339 


9 
47351 
4255 
#1 


Neyativer Uekertra93? Neins weiter kei 47319 
> Mantisse imvertierenr 


FRC normalisieren 
Accu 


Rundungsstelle loescher 

Zaehler fuer Bitwverschiekung (8 Bits verschoben? 
Bereits um 32 Bit verschaben? 

Neins zurueck zum Anfang der Schleife 

alle Bytes der Mantisse sind gleich 8, 

also ist auch FRC gleich ®8. Vorzeichen und 
Exponentbyte werden daher auf RA gesetzt 


identischem Yoarzeichen 


Rundungsstelle 


> Veberlaufkit; falls ncetiya, in Mantisse zurueckshitfter 
Bitzaehler erhoehen 
FAC so lange nach links verschieben, kis das 


hoechstwertigste Bit der Mantisse wesetzt ist 


Binaerexpaonert kleiner als Anzahl YVerschiektungen” 
Jas Underflou,. Zahl wird als GA behandelt 
Exporent um Anzahl der Verschiebungen vermindern 


194 


+ >09 


(en © + EBSAn>Slcl zZ - - - - - - +41 


untissenaddition (Fortsetzung? 


s”g12 STAR 37 

47414 BCC O2 47430 Ist die Carrv-Flas durch Vekerlauf sesetzt? Nein: RTS 
37316 INC 237 Exponent um eins erhoshen 

17418 BEO 47486 leker lauf im Expanenten? Ja: "OVYERFLOW ERROR" 

7420 FOR 98 lJeberlaufkit in Carrv in Mantisse zurueckschieken, 
47422 ROR 33 Carr» erhzaelt Position des haechstwertigasten Bits 
17324 FOR an 

i7426& ROR 101 

7423 ROR 112 

s3743a RTS 


-arzeichen der Mantisse invertieren (kei negativen Ersebrissen? 


47431 LOA 102 Einserkomplement der Mantisse von FRC Kilden 
7432 EOR #255 

47435 STA 192 

7437 LOR 98 

27432 EOR 4255 

27441 STA 38 

4?’443 LOR 39 

27445 EOR 4255 

479447 STA 39 

17443 LDA 190 

7451 EOR #255 

37453 STA 1a 

47355 LODOR 101 

47457 EOR #255 

47459 5STA 101 

ı’4sl LOA 1iz 

4ı74&2 EOR #255 

37455 STA 112 

47467 INC 112 Mantisse um eins erhoehen 
7469 EBENE 474935 

37471 INC 191 

47473 BNE 47435 

7475 INC aa 

47477 BNE 47485 

47473 INC 32 

47481 BNE 47495 

47483 INC 33 

37485 RTS 

74585 LDE #413 Code fuer "OYERFLOLU" 
47485 IMP 42033 > Fehlermeldung, RERDY. 


wsechtsuerschieben eines Registers 


LD« #37 «RER als Offszset-Pointer fuer Funrktionszsresister laden 


47491 

37433 LDY 4.8 Rechtsuverschiebung um ein Byte 
37435 5T'r 112 

47497 LD'Y 3.8 

37499 ST'Y +.% 

y5al LDY 2.4 

47503 STY 3.8 

47595 LD'Y 1,* 

37507 STYr 2,8 

47507 LD’Yr 104 

37511 ST'Tr 1,x 

47513 ADC #3 Bit-Zaehler um 8. erhoehen 
47515 BMI 47433 Groesser 97 

47517 BEQO 474923 Nein: weiter „erschieken 


195 


EN ©&4 EASIC „zZ - - - - - - 


Rechtsverschieken eines Reqaisters 


47519 
47521 
47522 
47524 
475326 
47528 
47530 
47532 
47534 
47536 
475383 
47540 
47542 
47543 
47544 
475465 


47547 


SBC 
TA'rYr 
LDF 
BCS 
ASL 
BCC 
INC 
FÜR 
ROR 
ROR 
FOR 
ROR 
ROR 
INY 
BNE 
CLC 
RTS 


#8 


BRASIL-Funktion LOG 


Fortsetzung?) 


BEit-Zsehler um 5 vermindern 


Erseknis = O7 . Fertia, 
hosechstwertiges Bit 

=1? Nein: weiter hei 4332 
hoechste Mantissenstelle um eins erhaehen 
zssemtliche Stellen um ein Bit nach recht schieken 


Tabelle mit Fliesskoammakoanstanten 


47548 
47553 
47554 
47553 
47564 
47563 
47574 


47620 
47622 
47624 


476453 
47648 
47649 
47652 
47654 


123 

ie 
127 
128 
128 
130 
128 
123 
128 
128 


ISR 
BEN 
BPL 
JMP 
LODR 
SBC 
PHR 
LDA 
sSTA 
LDR 
LD'Y 
ISR 
LDR 
LD'Y 
ISR 
LOA 
LOW 
ISR 
LDA 
LO'Y 
JSR 
LDA 
LO 
ISR 
PLA 
JISR 
LDA 
LDY 


a 


3 
15 


24 
13 
113 
Se 
33 
53. 
128 
49 


17 


11 


4s171 
4r’601 
47604 
45544 
Ir 
#127 


#123 
Erz 
#214 
#195 
47207 
#219 
#185 
47887 
#133 
#195 
47194 
#193 
#185 
Sr4ill 
#224 
#185 
47207 


45514 
#223 
#185 


3 


& 2 


= 


= = 


a 
4 
4 
a 
4 


a 


Bit-Zsehler um eins erhoehen 
und weiter verschieben. kisr Zaehler = & 
a 1 
Polvrncomarad 
121 a.434255942 4 Koeffizienten 
1094 a.5786334541 
22 a.96512a07353 
32 2. 8353947” 
22 a.r’arıiasY’sl SIRLA.TI 
2 1.41421356 SORı2)> 
a -a,.2 
243 a.893147131 ln 2 
> pruett zuf Yarzeichen und & 
Argument = 47 Ja: "ILLEGAL QUANTITT ERROR" 


qgroesser RA? Ias weiter kei J4radd 

> "ILLEGAL QUANTITTYT ERROR" 
Expanentkyvte von FRC 

128 zußktrahieren (Carry ist gelsescht) 
Exponent sauf Stack retten 


Jetzt gilt: 9.2 <= FRC £ 1 


Acc RD) = Yard. Startadresse „van ZQRı.a, 57 


ı= Konstante + FRC 
475793. Startadresse san SORUZE) 


> FRC 
Accu’ TR) := 


Konstante . FRC 
47543, Startadreszse „on 1 


> FRAC := 
Acc TR) ı= 
Konstante + FRC | 

ı= 47553, Adresse des Paoalvnomar ads 


> FRC 
Accu ’R) 


- 


> Palvrnomauswertung 
Acc TR) 3= 4/aS4, Startadresse von —-4.5 


> FRC ı= Konstante + FRC 

Expanent vom Stack holen 

> "Kennzahl" berechnen: Rccu zu Mantisse addieren 
Rec YR) ı= 47599, Startadresse von In 2 


196 


cErf SS BHSIcCc VZ = = Ar Mr - .- ne rd tn T = 
rithmetiks FRC := ARRG * FRAC 

47656 IJISR 47756 > Konstante, auf die (Accu/’YR> zeigt, nach ARG 
47659 BNE 4r7ösd4 FRC = 9? Nein: weiter kei 47664 

476681 IMP 47755 > FRC := ARG 

37664 ISR 47799 > Exponent des Ergebnisses durch Radition berechnen 
437667” LOA #40 Register fuer Funktionen initialisieren 

47669 STA 38 

47671 STA 39 

47673 STA 4a 

47675 5TA +1 

437677 LDR 112 

476793 JISR 47705 > Multiplikation 

47682 LDA 1091 

47884 ISR 47705 > Multiplikation 

47687 LDA aa 

47889 ISE 47705 > Multiplikation 

47692 LOA 39 

47694 ISR 477053 > Multiplikation 

47637 LOA 38 

476993 JISR 47710 > Multiplikation 

477’az IMP 48015 > Register fuer Funktionen nach FAC, FRC normalisieren 
47705 BNE 47r7ıa 

47var7 IMP 47491 > Resister fuer Funktionen nach rechts verschieken 
47710 LSR 

47711 ORR #128 

+7713 TAT 

4’v14 BCC 2 47vdl Binsere Multielikstian des Accus mit ARG, Ergeknis ins 
4rris CLC Register fuer Funktionen. Fuer jedes gesetzte Bit im 
47’vYir LODA 41 Accu wird ARG zum Funktiaonsregister addiert, unabhaengig 
477193 ADC 129 davan wird das Funktionsregister verdoppelt. 

47’v21 STA 41 Prinzip siehe auch 459a4) 

47723 LOA 4a 

47725 ACC 103 

4rv’z2r7’ STA 4a 

47723 LOR 33 

47731 ADC 147 

47733 STA 33 

47725 LDRA 33 

477237 RDC 16 

47739 STA 33 

47741 FOR 38 

477423 FOR 33 

47745 FOR nis) 

47747 RüRr +1 

47743 FÜR ilz 

47751 TrA 

‚rsz2 LSR 

Tra=3 BNE 47712 

47755 RTS 

konstante, zuf die “Accu tR) zeiat. nach ARG, Arithmetik vorkereiter 
ton STA 24 Konstante. auf die ÜAcce"rrR) zeigt, nach ARG 

47728 5TT 35 

+rrea LOYV #4 

47’v’sz LOA DET: Sy BR 

477e4 STA 103 

47765 DET 

4778 LOA Der Se nn u 


197 


Er 54 BRSIC WZ - - - - - - u 


RArithmetik: FRC := RRG * FRC (Fortsetzung?) 


477689 STA 148 

47771 DEY 

a’v7’2 LOA 343 ,Y 

47774 5TA 1097 

47776 DEY 

47777 LDR 34)>,Y 

47773 STR 118 “Vorzeichen var FAC und ARG verknueptfen 

47751 EOR 192 

47783 STA 111 

47785 LDA 110 

47737 ORRA #128 

47733 STA 1a6 

47791 DET 

47792 LDA 34) .Y 

47794 STA 195 

47738 LDA 97 Expconent »on FAC Salz Kennzeichnuns, falls FAC = © 
47798 RTS 

47799 LDA 1905 Expanernt von ARG = 097 

479801 BEO 47834 Ja: Ruecksprungadresse Jam Stack holen, FRC := 0, RTS 
47803 CLC 

47804 ADC 97 Expcanernten van FRARC und ARG addieren 

47806 BCC 47812 | 

47808 BMI 47839 leker lauf im Expanenten? Ia: "OVYERFLOW ERROR" 
47310 CLC 

47811 BIT nu e 

47’S12 BFL 47836 Under flau? Jas FAC := a, RTS 

47314 ROC #123 

4vY’Ss16 STA 97 ersikt Expanenten won FRC 

473153 BNE 47823 

aqrsza IMP 47353 > FAC sı= 8, RTS 

47823 LDRA 111 Verkruepfung der VYarzeichen von FRC und ARG 
473825 STR 102 als Yarzeichen des Ersgeknisses in FAC speichern 
47827 FRTS 

47828 LDA 122 Vorzeichen pasitin,? “uql. EST) 

47830 EOR #255 

47332 BMI 47839 Ja: "QVYERFLOW ERROR" 

47334 PLA Inderflow: Ruecksprungadresse om Stack 
47335 PLA. 

47236 IMP 47351 >= FAC := a, FTS 

47339 IMP 47496 > "OVYERFLOU ERROR" 


Arithmetik: FRAC := 10 % FRC 


47342 JSR 48148 > FRAC runden. ARG := FRAC 

47345 TA Expsment „on FRC 

47546 BED 47364 FARC = 07 Ja: RTS 

47243 CLC 

47843 ADC #2 Binzerexponent um zwei erhoehen Ventspricht 4 % FRAC) 
47921 BCS 479339 Vekerlzuf? Ia:s QYERFLOMN ERROR 

478353 LDX #9 

473593 ST 111 

478537 JISE 47223 >» FRC := ARG + FRC “mit ckisem Ersgeknis also # > 
47350 INC 37 Binserexpanent um eins erhoehen “entspricht 2 # FRC5 
47362 BER 47339 lebkerlauf? Iza: "OWVERFLOM ERROR" 

47864 RTS 

473865 132 32 a [<! a konstante 14 


198 


CBM S4+ BASIC vz a 3 . i n e 47970 


Arithmetiks FRC := FRC 7 18 


47370 JISR 48140 > FRC runden. RRG := FRC 

47873 LDA #249 RAecu/YR) :ı= 47865, Startadresse won 18 

47875 LDY #136 

47877 LDX #0 

47379 ST* 111 

47881 ISR 489434 > FRC mit Konstante, zuf die (AccwiYR) zeist, laden 
47834 IMP 47890 > FRC := ARG .“ FRAC 


Arithmetilk: FRC := ARG . FRC 


47837 ISR 47756 > Konstante, zuf die (AccwrR> zeiast, nach RRG 
478398 BEQ 480108 FAC = 0? Isa: "DIVISION BY ZERO ERROR" 
47392 JISR 498155 > FRC runder 

47895 LDA #0 

47397 SEC 

47893 SBC 37 Vorzeichen des Expanenten von FRAC wechseln 
47900 STA 937 

47902 JSR 47799 > Expanent und Yorzeichen des Ersebrisses bestimmen 
47905 INC 37 

47907 BEQ 47839 Ueker lauf im Expanenten” Tas "OVYERFLOWM ERROR" 
47903 LDS #232 Pointer zuf Funktionsresister (in Zerao-Page zyklisch!; 
47911 LODRA #1 

47913 LDY 1a6& FAC mit ARG kurteweise vergleichen 

47915 CPY 33 

47917 BNE 47935 

47913 LDY 107 

47921 CPY 939 

47923 BNE 47935 

47925 LDY 1983 

47927 CP'Yr 1090 

47929 BNE 47935 

47931 LDY 143 

47933 CP'Y a1 

47935 PHP Ststusregister zuf Stack retten 

47936 ROLL 

47337 BCC 47948 

47939 IN“ 

47940 STA 41,8 Ergebnis in (38,....42> aufbauen 

47942 BEQ 47994 sR gleich A? Ta: weiter bei 47994 

47944 BPL 47998 *R sleich 1? Ja: fertig, weiter bei 47998 
47946 LORA #1 

47948 PLP 

479343 BCS 47365 FAC <= RRG? Ia: weiter kei 47965 

47951 RSL. 1093 ARG verdoppeln 

47953 ROL 198 

47955 ROL 197 

47957 ROL 196 

47933 BCS 47935 Vekerlauf? Ja: weiter 47935 

47961 BMI 47913 hoechstwertiges Bit gesetzt? Ja: weiter kei 479713 
47963 BPL 47935 sonst weiter kei 479335 

47965 TAY Mantisse won ARG minus Mantisse von FRC 
47966 LDA 1099 

47968 SBC 101 

47970 STR 199 

47972 LDA 1383 

47974 SBC 198 

47976 STA 198 

47975 LDA 197 

47980 SBE 939 

47982 STR 197 

47984 LDA 106& 


199 


CcBMN S4 BRSIC Ww2Z - - 


RArithmetik: FRC 


47936 
47938 
47998 
47991 


47994 
479396 


47993 
47993 
43000 
4saa1 
43002 
42aa3 
45004 
"4206 
43007 
asa1la 
43012 


43015 
43417 
43019 
43c21 
43023 
43025 
43a27 

saz23 


42031 


SBC 
STR 
TYA 
JMP 


LDA 
BNE 


RSL 
ASL 
RSL 
ASL 
ASL 
ASL 
STA 
PLP 
JMP 
LD*S 
IMP 


LoA 
STA 
LDA 
STA 
LOA 
STA 
LEA 
STA 
IMP 


#64 
47948 


112 


43013 
#24 
42039 


383 
38 
39 
99 
49 
ı1aG 
41 
a1" 
473193 


+’ 93S8& 


ı= ARG  FRC (Fortsetzung) 


Unkedinster Sprung 


Accu) ı= 84 % (Accu) 


ergibt Rundungsstelle 

> Ergekris nach FRAC, FAC normalisieren 
Code fuer "DIYISION By ZERO" 

> Fehlermeldung, READY. 


Register fuer Funktionen nach FRC uvebertragen 


- 


> FRC linkskuendiga machen 


Kanstante, auf die “ARccuwYR)> zeiat. nach FRC <Speicherformat in Registerformat> 


48034 
430365 
43028 
48040 
45042 
43044 
45045 
48047 
430493 
4gasa 
43052 
48054 
48055 
48957 
4859 
43051 
43053 
42064 


4506656 5 


43063 
4zara 


STA 
STr 
LO'Y 
LOR 
STA 
DE'Yr 
LODA 
sTtA 
DE'Y 
LOA 
STA 
DE'Y 
LDA 
STA 
ORR 
STA 


34 
35 
#4 


34) ,'Y 


161 


34) .Y 


108 


345 .'Yr 


933 


34) .Yr 


102 
#128 
23 


AccurR) nach 34.735) 


LSB der Mantisse 


MSB der Mantisse “Bit 7 ist Yorzeichenflag? 
Register fuer Yarzeichen von FRC 

Bit 7 <hoechstwertiges Bit? zuf eins setzen 

in Register fuer MSB der Mantisse von FRC kringen 


Expanentkute 


Rundunasstelle loeschen 


lehertraguna van FAC an andere Stelle 


435071 
43073 
42074 
430786 
434073 


#22 


Zielbkereich (92,....96) 
Zielbereich (87,...,91? 


Pointer zuf Zielbereich high 
InBedinater Sprung 


200 


c-EBri 


>S>+ EHZS>Ic zZ - - - = - 


D 


ilekertragung von FRC an andere Stelle (Fortsetzung) 


43088 
493032 


43034 
43937 
42083 
48091 
42033 
43095 
43097 
423098 
43100 
43102 
43103 
431053 
45107 
481483 
45110 
49112 
49114 
48116 
48117 
48119 
45121 
48123 


LD« r’3 
LDY v4 
JSR 48155 
5ST*x 34 
STYr 3a 
LD'Y #4 
LOA a1 
STR 

DE'Y 

LOA 180 
STA 

DE'Y 

LODA 29 
STA 343, 
DE'Y 

LDA a2 
ORA #127 
AND 38 
sSTRA 

DE'Y 

LDA 97 
STA 

STY 112 
RTS 


lekertr aguna van 


48124 
451265 
48123 
43130 
43132 
43134 
45135 
43137 
43139 


LDA 12 
STA 182 
LD* #9 
LOA 
sta 
DER 
ENE 43130 
ST 112 
RTS 


llebertr auuımna „or 


481408 
438143 
48145 
48147 
43143 
ag150 
48152 
48154 


FAÜ runder 


a ca ga da od co 
Be 
u u Ce | a | 
I u a We EN u Bu Br 


JSR 43155 
LO #6 
LOR IE.# 
STA 1a4.: 
DE: 

EHE 451475 
ST“ i1l2 
RTS 

I_DA 3, 
BEU 42124 
RSL 112 
eicl 342124 
JerR 0 4741 
EHE 43154 
IMP 44 


243 ,Y 


3453 ,Y 


34) ,Y7 


343,7 


1a4 ,x 
I8,R 


Startadresse des Zielkereichs in (Y3/74) 


> FRC runder 

Zeiger auf Zielkereich setzen 
FAC in Zielkereich uvekertr agen 
LSB der Mantisse 


Vorzeichenkvte fuer FRC 

Bits @ kis 6 fuer "RAND" zuf eins setzen 
und MSB der Mantisse hineinkringen 

cMSBit wird durch Yarzeichenflag ersetzt) 


Exponentkute won FRAC 


Rundungstelle von FRC loeschen 


nach FRC 


VYoarzeichenbvte van ARG 


- u tn Din 


in Reaister fuer Yarzeichen „an FAC uvekertrasen 


Fundunastelle „an FRÜ loescher 


nach AFG 


= FRAC runden 


Rundumnasstelle von FRC lceschen 


Ex:ronent = da Waisco FHAl = 057 
Ja: FRTS 

Runddunmaszstelle 2 12987 

Ja: FTS 


> Mantisse um eins erhoehen 
Matisse jetzt ruıll? Nein: RTS5 
= Mantisse nach rechtz schieken, Expaonernt 


201 


erhoehen 


CEr S+ BrRSIc WVZ2 - - - - - - 


Vorzeichen von FRC pruetfen 


43171 
43173 
48175 
48177 
4531783 
43180 
481832 
451234 


LDA 
BEQ 
LDA 
ROL 
LDA 
BCS 
LDA 
RTS 


97 
43184 
122 


#255 
43194 
#1 


BASIC-Funktion SGH 


48135 
45188 
481970 
48192 
43194 
48196 
43198 
43208 
43201 
43203 
43205 
43207 
43209 
48211 
43213 


JSR 
sTA 
LOA 
STAR 
LD« 
LDA 
EOR 
ROL 
LOR 
STA 
sta 
ST“ 
sta 
STA 
JMP 


43171 
938 

#0 

39 
#136 
38 
#255 


#0 
181 
aa 

97 
112 
122 

47314 


BASIC-Funktion ABS 


43216 
48218 


Zahlerweraleich zwischen FRC und Konstante, 


48217 5 


49221 
49223 
43225 
43227 
45228 
43223 
43231 
48233 
43235 
43237 
43223 
43241 
43243 
43245 
43247 
43249 
43254 
43232 
43254 
43256 
48257 
43259 
43261 
43253 
43264 
43266 


LSR 
RTS 


182 


Ergeknis der Pruefungı 


I FRC IAccu IC-BitizZ-Bit IN-Bit|l 
I a ıı a ı 98 ı a ) 
I=8a|I a I uw I 1 ıa ı 
ıIi<zoa ı 255 1 1 ıa ) 1 | 


2 


Vorzeichen van FRC pruefen \l, a. 255 fuer +, 


Expanertkbvte fuer Eraeknis 


Expcanentkute fuer FRC 


> Invertieren. 


> Bit 7” im VYarzeichenkvte „on FRÜC lcoeschen 


zuıf Jdie "Accu TR) zeit 


Pointer surf Kanstante setzen 


Expanentkuvte der Konstanter 


Expconent = 47 Iza: Yaorzeichen „on FRC pruefen 
hoechste Stelle der Konstanten 
Yoarzeichenkhurte „an FRC 
Vorzeichen unterschiedlich” 
Expanenten veraleicher 
unterschiedlich? Ja; weiter hei 42274 
“orzeichenkit in Yersleichzahl setzen 
NSBzE Vergleichen 


zweite Stelle vergleichen 
dritte Stelle Jeraleichen 


. 


Fundunasstelle von FRC mit 127 veryleichen 


202 


J!Jas weiter kei 48175 


a, 


+Z3171 


=> 


+alls regatio und linksbuendia machen 


CcPrI &4 BRAZ>SIC Ww=Z - - - - - - un dr 


Zahlerwergaleich zwischen FRC und Kanstante “Fortsetzuna? 


48268 LOA 367 ,'r Letzte Stellen voneinander zuktrahieren 

43278 SEC 11 mit Carr» semaesz Vergleich der Rundungasstelle 
43272 BEQ 453194 Alle Stellen 3leich?” Tar RTS 

48274 LODA 1932 Vorzeichen won FRC 

49327& BCC 48280 Konstante < FAC? Ias weiter bei 4280 

43278 EOR 4253 Accu imwvertieren 

43288 IMP 48177 > Yerqgleichsroutine fuer & 


Umwandlung einer Fliesskaommazahl in Inteser: 


48233 LOR 97 Expcanent san FRÜ 

43235 BEQ 48361 = a4? Ja: weiter kei JS361 
48287 SEC 

48288 SBC #160 Integer -Expanenrt 

43290 BIT 102 FRC pasitiv? 

43292 BPL 43303 Ja: weiter hei 4S3a3 

43294 TAX 

43295 LDA 4235 

432937 STR 104 

43299 ISR 47437 = Mantisse von FRÜ imwertieren 
453042 TXA 

43303 LDX« #97 SR als Offset-Pointer zuf FRC 
43305 CMP #249 Expanent ygroesser als -3? 
43307 BPL OA 48315 Ja: weiter bei 43315 

438309 ISR 47513 | > FAG mach rechts verschieben. biz Expanrent = Ad 
48312 ST'Y 194 

48314 RTS 

48315 TfA'r 

43316 LDRA 102 

48318 AND #128 Vorzeichen izsalieren 

438320 LS5R 93 

48322 ORR 38 

43324 STA 938 

48326 JSR 47536 = FRC nach rechts verschieben (mit Carrw> 
43329 STY 104 


48331 RTS 


BASIC-Funktion INT 


48332 LDA 37 Expaonentkute von FRC 

48334 CMP #150 aroesser «der „sleich 184 KFAÜ also zawiescı Yyanzzahlia>” 
43336 BCS 48370 Ja: RT5 

48338 JSR 483283 > Fliesskanmmazahl in Inteser umwandeln 
48341 ST'r 112 Rundmasstelle lceschern 

43343 LDA 102 Vorzeichen in Accu bringen 

43345 STYr 192 Vorzeichen positiv machen 

48347 EOR #128 

48349 ROL Carrv kei nmesativem Yorzeichen loeschen 
483580 LDA #160 

438352 STR 97 

48354 LDA 101 

43336 STA 14 

48358 IMP 47314 > FRC linkskuendig machen 

483651 STA 28 Mantisse von FRC mit Hullen fuellen 
48363 STA 39 ziehe 43235) 


48365 STA 198 
43367 STR 101 
48369 TAY 
48370 RTS 


203 


CO Er 


STRFRAC. 


Eindake: 


4837 
4337 
4837 
4837 
4837 
48383 
483332 
48284 
482336 
43388 
4333 
482392 
43334 
4237 
48333 
42421 
43403 
42405 
43407 
4241 
43412 
43414 
42415 
43413 
43420 


48422 


42441 
48443 
42444 
42446 


42449 
42451 
9453 


LO 
LD» 
SsTYr 
DE* 
BPL 
BCC 
CMP 
BNE 
sTa 
BEQ 
LMP 
BHNE 
JSR 
BCC 
CHP 
BEÜ 
EMP 
EBENE 
JSR 
BCC 
cHP 
BEU 
CMP 
BEU 
CHP 
BEQ 
cHP 
BEU 
BNE 


ROrR 
SR 
BIC 
EIT 
EL. 
LODA 
SEC 
SBC 
IMP 


RÜr 
BIT 
EWC 
LOA 
SEC 
SB 
STA 
BEU 
BI. 
ISFR 
INC 
BNE. 
BEU 


erstes 


D ‚r 


#423 
482399 
115 
42490 
#46 
48449 
#59 
48455 
115 
42435 
#171 
42430 
#45 
48430 
#170 
48432 
443 
48432 
48437 


„ 
er 


CHRGET-Pceinter auf erstes Zeichen des Zahlenstring, 
Zeichen im Accu 


793,0... .103) mit @ varkesetzen 


zeichen Ziffer? Ta: weiter bei 
ceade fuer '"-'"7? 

Nein: weiter kei 43390 

103) := 255. Yorzeichenflayg setzen 
Iinbedinater Sprung 

Cade fuer "+" 

Hein: weiter kei 43333 

> CHRGET halt naechstes Zeichen 
ziffer?” Ia: weiter bei 48494 

de fuer "„"?7 

weiter hei 48449 

de fuer "E"? 

ein: weiter kei 4834595 
> CHRGET halt nasechstes 
ziffer”?” Ia:r weiter 434353. 
BASIC-Coade fuer "-'"? 
weiter kei Ja43a 
ARSCII fuer "—-"? 

Jas weiter hei 4434 
BASIC-Code fuer "+'?7? 

Ja: weiter kei 43432 
RSCII fuer "+'7 

Tas weiter kei 43432 


er=tes 


‚a 
Ja 
a 


zaanN 


Zeichen 


Ia: 


Bit 7 von (96) setzen 

= CHRGET holt naechstes Zeichen 
Ziffer?” Ia: weiter kei 48529 
Bit 7” van (96) sesetzt” 

Nein: weiter kei 43453 


Hegati.er Expanents 


Aufruf durch Dezimalpurkt 

kereitz zweiter Dezimalrunkt”? 
Nein: weıtermachen 
gelesene Zahl yemsese Paeition 


des Dezimalpunrnlts 


und Expanerten anpasser 


204 


Umwandlung eines Zahlenstrinas in eire Fliesskommazahl 


43397 


weiter kei 43523 


“"orzeichen des Expanenten wechseln 


c-Er1 


Imwandlung eines Zahlenstrings 


48475 
48475 
43484 
48432 
48484 
42436 


498497 


48494 
45491 
48493 
43495 
43437 
435g 
48501 
43702 
48504 
43507 


48514 
48511 
48514 
48515 
49518 
48524 
43522 
4anzd 
49325 


48323 
43331 
48333 
48735 
48337 
433393 
45541 


48544 
49545 


+ RFRH>SIc 


JSR 
DEC 
BNE 
LOA 
BMI 
RTS 


IMP 


PHR 
BIT 
BPL 
INC 
ISR 
PLA 
SEC 
SBC 
JSR 
IMP 


PHR 
JSR 
PLA 
JSR 
LOR 
EOR 
STA 
LOS 
IMP 


LORA 
CMP 
BCC 
LOA 
BIT 
EMI 
JMP 


RSL 
ASL 


> CLC 
” RDC 


ARSL 
CLC 
LO 
AD 
SEC 
SBC 
STR 
IMP 


47842 
34 


#48 
48510 
48394 


43140 


43138 
119 
102 
111 

97 

47210 


34 
Ha 
48544 
#100 
365 
43558 
47486 


> FRC 


gelesene 


= FRC # 10 


Geleserne Zahl neuativ? 


Ja: 


- 


Aufruf durch Mantissenzitfer 


> Yarzeichen 


„an FRC wechseln 


Vorkommastelle” 
Ja: weiter bei 43497 


Zaehler fuer Anzahl Nachkommastellen erhoehen 


> FRC 


ASCII in Ziffernwert 
> Ziffer zur Mantisse won FRC addieren 


ı= FRC %* 1 


> naechstes 


> Accu in hoaechste Stelle „von FRC kringen 


Zeichen 


Yarzeichen van FRC 
und Vorzeichen van ARG 
miteinander verknueptfen 


= FRC 


Rufruf durch Expomentenziffer 


= ARG 


+ FRC 


Yarzeichen imvertieren 


holen 


dritte Expanentzitfer? 
weiter bei 48544 


Nein: 


Vorzeichen nregati.” 
Ja: Undeflou. 
> "GWYERFLOU ERROR" 


Expament mit 10 multiplizieren 


und neue Fxpaorentzifter addieren 


gelesene Zahl als Null behandeln 


3333339 


wo 


chste Ziffer holen 


205 


zon a kis 9 umwandeln 


in eire Fliesskommazahl (Fortsetzung) 


+34 075 


Zahl Yemaess gelesenem Expoanenten anpassen 


cCcErn S4 ERSICcC vw - - - - - 


423575 


Rusgake der Zeilennummer kei Fehlermeldungen, ’LIST” etc. <Einsprung 48589) 


43378 
435534 
493582 
48585 
493587 
435333 
43591 
435933 
48593 
43596 
43599 
436502 


Umwandlung 


43503 
48607 
436069 
49611 
43613 
49615 
43618 
486208 
48622 
48623 
49625 
43627 
493629 


43632 
435634 
43636 
43638 
43640 
43642 
43644 
43647 
48649 
43651 

43633 
436595 
43633 
49584 
43662 
43664 
436568 
4356593 
43671 

43673 
493576 
43678 
43638 
43633 
42635 
43687 
43538 
493693 
43695 
43697 
43698 
43708 


LOR 
LOD'Y 
JSR 
LOA 
LDOX 
STR 
STK 
LD% 
SEC 
ISR 
JSR 
IMP 


LEN 


LORA 


BIT 
BPL 
LOA 
STR 
STR 
SsTVv 
INY 
LDR 
LD*« 
EBENE 
JMP 


LOR 
CP* 
BEQ 
BCS 
LOA 
LOW 
JSR 
LDR 
sta 
LDA 
LDY 
JSR 
BEQ 
BPL 
LDA 
LD'Y 
JSR 
BEQ 
BPL 
JSR 
DEC 
BNE 
JSR 


#113 
#153 
43642 
58 

37 

98 

39 
#144 


42201 
43607 
43306 


von FRC in 


#1 
#32 
182 

43515 
445 


233,YV 


192 
113 


#443 
a7 
43632 
48904 


#0 
#125 
43640 
43649 
#133 
#189 
47656 
4247 
33 
#184 
#189 
432173 
43630 
48634 
#179 
#199 
432193 
43673 
43687 
47342 


eRc-cHTR? 3= 41941, Startadresse von " IN " 


> Rusaske „an " IN " 
laufende Zei lennummer fuer ERRÜR 


in die heiden hoechsten Stellen von FRAC 


Expanent :ı= 1& (144 — 123 = 15? 


> wekrige Stellen warn FRC mit Null fuellen 
> FRCSTR wandelt FRAC in String ak 2565 um 


> String drucken 
einen Zahlenstr ing 


Zeiger auf Stringkereich 


Code fuer Space (Yarzeichen fuer poasiti.e Zahl)» 


“arzeichen an FAC 
peositiw? Jar weiter kei 49615 
Cade fuer "-" 


in erste Stelle des Stringkereichs krimaen 


ASCII fuer Null 

Expanent = 0? 

Nein: weiter kei 48 
> 


32 
> RSCTI-NUll nach ”. 


& 
be Endezeichen nach 
Expamentkute san FAC = 1237 


Ja: 0,5 “= FRC < 1, weiter kei 434840 
FAC >= 1? Ia: weiter bei J3549 


Accu VR) ı= 49573, Startadresse von 1E+43 


> FRC := Konstante % FRAC 
entspricht -3 . 
.933> = -9. falls FAC X 1. sonst (9335 


Acc VRR) 9= 4HIE8, Startadresse san 333333339 


> FAC mit Konstante versleichen 


Accu YR> 3= RSÄR, Startadresse warn 399993993. 73 


> FRC mit Kanstante „eraleichen 


>= FRC := 10a %* FRC 
Dezim=lexponent vermindern 


> FRC s:= FRC / 1a 
Dezimslexponent erhoehen 


= FAC := 8.5 + FRC 

> Fliesskommazahl nach Integer umwandeln 
FRE liegt rum im Bereich von 1ES his 1E9 
93) enthaelt den Betrag der 
korrigierenden Zehnerpatenz 

Betra3 der Zahl < 98.81? 

Jas weiter bei 48711 


RTS 


CBM S4 BASIC vz R z ® u E E 43 70Z 


awandlung von FRC in einen Zahlenstring (Fortzetzuna? 


42702 CMP #11 Betraa der Zahl > 1E9? 

48704 BCS 43712 Jar weiter bei 48712 

43786 ADC 4255 

48708 TAX 

48709 LDA #2 

48711 SEC 

48712 SBC #2 

48714 STA 24 Expanenti=ldsrstellungsfl24 (= wenn „@al <= Betrag < 1E9) 
48716 ST 33 Neyativdarstellung des Expoanenten 

48718 TXA 

48719 BEQG 48723 a.i <= Betraa © 17? Ia: weiter bei 43723 
43721 BPL 48742 9.01 <= Betraa Z 4.17 Nein: weiter hei 43742 
48723 LDYV 113 

48725 LDRA #46 ASCII fuer ".„" 

48727 INY 

48728 STA 2355 ,'Yr in Stringkereich krinsen 

48731 TXRA 

48732 BEQ 48748 a.1 <= Betr=a <{ 1? Ia:s weiter kei 43740 
48734 LDA #43 ASCII fuer "0" 

48736 INY 

48737 STA 255,Yr in Strinakereich kringen 

48749 ST'Y 113 

48742 LDY #0 Pointer in Takelle mit Stellenwerten 

48744 LD* #128 

48746 LDA a1 Durch wechzelnde Addition und Suktraktieon 
43748 CLC der Stellenuwerte aus der Koanstantentakelle 
48749 ADC 48921 ,.'r werden die einzelnen Ziffern des Zahlenstr inas 
48752 STA 121 ksrechret. 

48754 LDRA 1a 

48756 ADC 493920,.'7 

487393 STA aa 

48781 LODRA 39 

43763 ADC 498919,.Y 

48766 S5TA 239 

48763 LDA 98 

48770 RDC 43918,Y 

48773 STR 983 

48775 INA 


48776 BCS 45782 
48778 BPL 48746 
48730 BMI 457934 
43732 BMI 49746 


48734 TXA 

435785 BCC 48791 Komplement addiert? Hein: weiter bei 437931 
48787 EOR #255 Ergekris kezueslich 12 komplementieren 
48789 ADC 410 

48791 ADC #47 eraibt Zifferncoode 

48793 INT Tzbellernzeiger zuf naechste Kanstante fuer 
43794 INY Stellerwmerte setzen 

48795 INY 

48796 INY 

48797 5TYr vi 

487993 LDY 113 Zeiger auf Stringbereich 

438061 INY auf nmaechste Zifferpcositiaon erhueher 

43802 TAX 

488083 AND #127 Zifferncode 

438085 STA 235,7 in Strinakereich kringer 

488883 DEC 93 

48819 BNE 488123 Einerstelle erreicht” Hein: weiter bei 42812 


207 


Br 


Umwandlung vorn FAC in einen Zahlenstring 


48812 
48814 
48815 
48818 
48820 
48822 
48823 
499825 
48827 
48328 
48920 
43832 
48924 
48836 
43338 
48241 
48842 
48844 
43248 
493348 
48850 
43851 
48853 
49855 


Ir) 
be En Bay BE sr 


OD DD ini 
AWEENDTIT EN SUDOUONUMIDDO NUN END ee ID 


BRELBLRLLLELLLDLRLRLLLBDrRnL 
0 CO 


bau Iady u Bas BES Es a BE U BR Su Es a BE CHR se Hs ı Ey Bas En Bas Ba Ba En nt 


BL LH 
re ) 
yon 
m a 


un LE BER 


>44 FEHzZSIc zZ - - - = - - 


LOA 
IN'Y 
STR 
sT'r 
LO 
TARA 
EOR 
AND 
TAx 
CP'Y 
BEQ 
CP'Y 
EBENE 
LO 
LOR 
DE'Y 
ZHMP 
BEO 
CHP 
BEO 
IN'Y 
LOA 
LD« 
BEUÜ 
BL 
LOA 
SEC 
SEC 
TA« 
LOA 
STR 
LOA 
STA 
TA 
LD» 
SEC 
IN“ 
SBC 
BCS 
zlaie 
STA 
TARA 
STA 
LOIA 
STA 
BEN 


STAR 
LDR 
sta 
LEA 
L.EY 
RTS 


123 


1%) 


#255 
#128 


#35 
43336 
#60 
423746 
113 


ea, 


#43 
43333 


\.D 
EIh9U0 4 
NW RG 


he | 
% 


-T 


„Y 


Fortsetzung? 
RSCII fuer "." 


in Stringbereich krinmnaer 
Pcinter merken 
Takellenzeiger 


fuer Stellenwerte 


Ende der Fliesrskomma-Str ingumwandlung? 
Ja: weiter kei 43336 

Erde der Umwandlung von Slzstel Sekunden 
Nein: kei naschster Stelle weitermachen 


in TIF? 


letzte „cr Hull verschiedene Stelle suchen 
Code Tuer "a"? 

Jas weiter hei 433393 

Code fuer "."7? 

Ja: weiter kei 43321 


Code fuer "+" («Expanentialdarstellung) 

Fla4 fuer Expamentialdarstellung gesetzt? 
Nein: weiter kei 43943 

Zehrerexpanent pcositie,? Ja: weiter kei 43367 
Betr=u4 des Expanenten berechnen 


ade fuer "-" 
in Stringakereich kringer 
Cade fuer "E" 
in Strinakereich bringen 
ASCII fuer Zehnerstelle des Expanenten berechnen 


Lode fuer Eirerstelle des Expanernten berechnen 
in Str ingkereich kringer 


Code fuer Zeirerstelle in Strinabereich bringen 


Endezeichen 

hinter letztes Zeichen setzen 

Inkedimater Sprung 

Endezeichen 

hinter letztes Zeichen setzen 

AccostR) = 2585. Startadresse fuer String 
[5 leitkommakonstante .5 


208 


+55 12 


wiederherstellen 


cC-EBr1 


= PeH>STIc 


wi ID 


Takelle mit Stellenwerten bei kei Umwandlung von Fliesskomma in String 


43918 
495922 
43326 
43330 
43934 
498938 
453942 
48946 
439504 


43954 2 


43958 


BARSIC-Funktian 


258 
a 
255 


17a 


ıa >31 


152 


43a09 JISR 45140 


49a1l2 
4714 


Arithmetik: 


49016 
49013 
49a21 
49a23 
43027 


49028 
49a3a 
49932 
49935 
49437 
490939 
49042 
49044 
43046 
49043 
49051 
49052 
490954 


LOR 
LO 


ISR 
BEN 
LDR 
BNE 
JMP 


LOS 
LO'Y 
JSR 
LORA 
BPL 
JSR 
LDA 
LO 
ISR 
BNE 
TTA 
LEOD'Y' 
ISE 


I, TrA 


Ja D 
un 1) 
5 

i| 

“) 


EUMONnDN 


FHRH 
ISR 
LOA 
LO 
ISF 
ISR 
FLA 

„SF 


Ei 


#17 
#121 


FRC 


48034 
49133 

195 
49028 
47353 


#783 
#0 
420834 
118 
4954 
43332 
#73 
#0 
432193 
Yaand 


a 
128 
132 
189 


& 240 


232 
156 

10 
255 


123 
192 
9& 
165 
153 
ein 


SsoRr 


ARG 


- 18290000 
1aaaaaaaı 
-18009a4 

12900908 
-1.a0908 
1a04 
-108 
18 

1 


Dezimale Stellenwerte im Integerformat 
zur Berechnung der Ziffern in der 
Dezimaldarstellung 


-2169498 
218a004 
3800 

S3Eg8 
-608 
ale 


Entsprechende Stellenwerte zur 
Berechnung der Ziffern fuer TI$ 


iva ıva ıvra 17a ır7a 


iva ıre ıyYa iva 174 


> FARC runden und nach RRG uebertrasenr 
Accu tR) 45313. Startadresse von 98.5 


T FRC 

auf die “AccwYRE) zeigt, nach FRAC 
FRC a? Ja: weiter bei 49133 

Expanentkvte von ARG 

0? Nein: weiter kei 49028 

FRC := & 


> Kanstante. 


e 
= 
= 
Ri} 
PX 


> FRC nach (73,2... ,.82) 
“orzeichen van RARG 
rcsitiw? Jar weiter bei 49054 
> INT schneidet Nachkoammasteller 


kringen 


FRC ak 


van 


> FRAC mit KVS,.....825 vergleichen 

Gleich “Exponmert sganzzahli9>? Nein: weiter bei 
Accu) := 4 ibert zus Sukrautine 43213) 

letzte Expanentstelle 

> Betrag von FRC nach RRG 


4+93a54 


letzte Expanertstelle 


>» LOG. FRC := In FRC 
= FAG ı= WVYS.....82> * FRAC 
> FAC :ı= exp FRÜ 


letzte Expanentstelle 
Ex:econent aradzahlia” 
3: FRTS 


209 


CP &I4I EFERSTIC 


Arithmetik: FRC 


49076 
493073 
49054 
49092 
49934 
49036 


LOA 
BEQ 
LDA 
EOR 
sTA 
RTS 


BRSIC-Funktion ExP 


Konstantentakelle fuer 


43037 
49992 
49093 
490983 
49103 
493108 
49113 
43118 
49123 
49128 


49133 
49135 
49137 
49140 
49142 
49144 
49146 
49149 


123 

7 
113 
11e& 
119 
122 
124 
1265 
128 
129 


LODA 
LD'Y 
JSR 
LDA 
ADC 
BCC 
JSR 
JMP 


.'—_ L_ [ }  ;  ; [| 1 1 
= RRG T FRC (Fortsetzung? 
97 FARC = 97 
49a3E Ja: RTS 
102 FRC := — FRC 
#255 
192 
Ex<P 
5& 17a 59 41 1.44269594 1.“ ıin 2 
Polvnomar ac 
52 883 82 5 2.14937637E-95 Koeffizienten 
22 126 179 27 1.43523140E—-a4 
47 238 227 133 1. 34226 348E-03 
293 132 28 42 3.651401 7B1E-A3 
933 893 85 18 . 555951269 
117 253 231 198 . 249226335 
49 114 24 16 593147136 in 2 
a a a a 1 
#191 Accu R> := 490987. Startadresse von 1. 44269514 
#191 j 
47656 > FRC ı= Konstante # FRC 
112 Rundungsstelle 
480 plus SA 
493149 kleiner 256? Jas weiter bei 49149 
43163 > Mantisse van FRC um eins erhcaehen 
57344 > Fortsetzung in zweitem ROM-Bereich 


210 


+37 


ed —I 02 


SI EenslIc = - - - - - - Eu Br gget Zn Zn 2 


BRSIC-Funktion EXP «Fortsetzung aus erstem RüOM-Bereich> 


57344 
57346 
37349 
57351 
37353 
37359 


37358 
57361 
37363 
57364 
37366 
37368 
37369 
57371 
57372 
37374 
37376 


57378! 


37380 
373932 
37383 
57395 
73987 
373939 
57392 
57395 
57397 
57399 
57482 
7404 
57486 
7407 
57410 


= 1 
43143 
97 
#136 
373583 
47328 


43332 
r? 


#129 
37353 


#1 


#3 
143,8 


Polvnomauswertung 


Sya4il 
57413 
57413 
57418 
57428 
57423 
57426 
57428 
37438 


57433 
57435 
57437 
57448 
57442 
57444 
57446 
57447 
57448 
57459 
s7452 
57454 
57456 


STR 
STr 
JISR 
LDA 
JSR 
F’SR 
LOR 
LD'Y 
IMP 


sTa 
STr 
JSR 
LDRA 
sta 
LD'Y 
INY 
TyrA 
BNE 
INC 
sta 
LD'Y 
JSR 


1123 


Rundunssstelle + 34 
> ARRG := FRC 
Expanentkvte von FRC 


FRC < 1287 Ia: 
> wenn pazitir, 


weiter kei 57253 


"QVERFLCOH ERROR". zanst Underflaou,. FRÜC:=H 


- 


> INT schneidet Nachkommsastellen =k 
Ganzzahliger Anteil 


FARC = 1277 J2: weiter kei 37357 


FRC mit ARG vertauschenr 


Rundunasstelle 


= FRC := ARG —- FRL 
= FAC := -FRC 


<AccwtrR> :ı= 43a92, Startadresse fuer Palvrcomauswer tıumd 


>= Palvenomauswer tung 


> Expanenten van RFG und FRÜ addieren 


Folvnaonmkerechmung attı+al#: 12422 #1 IH 2387 Hr... 
RARedresse des Pcolvraomarads zwischenspeichern 


- 


= FRC runden und nach Treuen. 31) uebhertra3en 


> FRC ı= (837 ..20..,91> 
> Polvnamauswer tur 
Acc VRR) = 37 


* FRC 


= FHÜ s= 27.2... .31> # FRAC 

Pcolvnonberechrunga alfl+21l#x:+ 328x242 38: t3H 24th... 
Adresse des Pcolvromarads zwischenspeicherr 

> FAC nach (92,.....96) yekertrauen 


Polvncmarad zlz Zaehler fuer Palvnconauswertuna 
Zeiger auf Antara der Kaeffizientent=zkelle setzen 


ı= Koeffiziert Painter in “Acc tr) # FR. 


> FRC 


211 


CC Er 


Pcolvnomsuswer tung 


> FHAz>lIc zZ - - - - - - 


bee Be = Em Ben 


Fortsetzung? 


274593 LDA 113 
Sy7461 LDY 114 
Sr4s3 CLC 

Sr4s4 ADC #2 
Ssv4s68 BCC 57469 
27458 INY 

Sr746593 STA 113 
Sr471 STr 114 
Sr473 JSR 2 d’z207 
Sv476 LDA #92 
Sr473 LET 40 
Srg4ga DEC 143 
Sr432 BNE 57456 
S7’434 RTS 
BR=SIC-Furktion FENO 
S7435 152 53 88 1 
Sr’490 14 4a 177 
S7495 ISR 0 4S171 
27498 BMI 573595 
Syrasad BNE 57534 
SyYsg2 JI5SR 765523 
rss ST} 34 
sr9a7 STr 359 
Sr229 LET #4 
Sail LDA 34) 
Sr7213 STR IR 
57512 INY 

srsiles LOA 34, 
SyYs13 STA 1a 
Sraoza LET #2 
Srazz LDR 345 ,Y 
SyYazd4 STR 33 
SrYSs28 INT 

Srazr LODA 243.7 
ara293 STA 121 
Srasl IMOoO al 
SvY’524 LORA #129 
Sroaes LOW 44 
SYa333S JIZSR  4sa2d 
5Sr’S4i LOR #141 
sr243 LO #224 
syads ISE 0 2 Jrsse 
Sra4S LER #146 
yrasa Lo 4224 
Ssvrazz ISR  4dY’2or 
Syaadn LOS 101 
Syraar LOA 38 
27359 STA ia1 
Srzel ST 33 
zrae2 LOS 29 
ran LOA ac 
ArZsr .STA 33 
Svrasd STe 1a0 
Srarı LOR 4a 
Eräar”s STA 102 
Syzro LOR Er 
araärr STR 112 


m 
DM 


Pceinter auf Koeffiziententsakelle auf 
nzaechzstes Element setzen 


>= FAÜ := Koeffizient + FRÜ 


Zaehler fuer Foalvnomauswertung vermindern 
alle Koeffizienten »errechnet? Nein: weitermachen ... 


u 11879546 
a 3. 927877’ r’4E-a3 
“arzeichen van FAC prueten 


weiter bei S7355 
Nein: weiter kei 37534 
Startadresse der IRR-CIA 


nequatiı? Tas 
Gleich Null” 
=» TOBASE holt 


Of+set-Pcinter setzen 


Werte zus Timer A 


sauje die Zehntel- und sanzen Sekunder 
aus "Time OF Daw" nach FRC vekertraser 


= yekersprirden Kiss W’I7T 


ALU YR) ı= 133, Startadresse der letzten Zufallszahl 
> 2139.20. .r143> nach FRAC vekertrasen 

Acc tR) ı= 57455. Startadresse ven Konstante 

=> FRC : netante # FRAC 


= 57490. Startadresse von Konstante 


Vorzeichen mcozsitijre machen 
Expaoanenten 
in Rundunasstelle hrimnsen 


212 


CO Er 


+ = = Fe u u ee = U) 7 = = = 


57573 


BRSIC-Funkticn RND “Fartsetzung) 


LDA 
STA 
JSR 
LD* 
LD'Y 
IMP 


#128 
37 
47319 
#139 
#0 
43034 


Ansprungadressen 


37293 
57595 
57397 
37399 
Srsal 
S76094 
57805 
57607 
378099 


Srelz 
57615 
Sr617 


BASIC-Foautirne 575 


en u L8 


1 


I 


ZT ag hd dh 
DU Be Be a EB a DE DET DE» DE A Bu Ba 2 Ba a DS ee ee 


NEL EEE CHEN EN IN EN EN EA LA KA EN EN EN CN 


ANA AIS AI 


np en nn Be 


CMP 
BNE 
ST'r 
5T* 
JMP 
TAsS 
BHE 
LD< 
JMP 


ISR 


BCS 
RTS 


LOR 


#290 
S768694 
6 

35 
42595 


357603 
#30 
42039 


55498 
37593 


44426 
4795 


#223 


1) 
ca 
Pa me 5 


J 
N] 
7%) 


zufalilszahl in Bereich von [ G:1 [ krinrgen 


[Y 


> FRC linkskuerdig machen 
Accu YR? ı3= 139, Startadresse der letzten Zufallszahl 


> FRC runden und nach “139,...,‚143> bringen 


und Errorhandling der KERNRL-Rautinen und I170-Befehle 


Accu = 249407? 

Nein: weiter kei 37604 

CXR/YR> als Paeinter auf Ende Arbeitsspeicher 
«Pufferkereich fuer RS-Z32 UVebkertr agung schuetzen? 
> CLR cahne CLALL 

Fehlercode im Accu = 8? 

Nein: Fehlermeldung ausweben, weiter kei 57609 
Code fuer "BRERAK'" 

= Fehlermeldung. READY. 


> CHRQOUT, Zeichen auf aktiven Kanal ausgeben 
Fehler” Iaı weiter kei 57593 


>= CHRIN. Zeichen vom aktiven Kanal halen 
Fehler?” Ja: weiter kei 57393 


> CHKQOUT, Ausgakevcrkerei tungen 
Fehler” Jar weiter bei 57593 


> CHEIN,. Vorbereitungen fuer Datenempfansg 
Fehler” Is: weiter kei 573593 


>» GETIN. Zeichen von Tastatur in Accu 
Fehler?” Ta: weiter kei 57593 


>= FRME'"W/L.. FRHANLM 
> GETREFR krinat SY75-Araument nach “209,’21> 
Fuecksprungadresse (S7671 — 1> zuf Stack legen 


ARaresse 133) entspricht dem Statusreasister 


Dateruekeraabe-Farsmeter fuer 575 wor 
L’Z0,.....7582) in die Reqister Accu, SF, TR bringen 
lert aus Adresse 1753) ins Statusresister kringen 
Rufruf der SY5-Rautine 

Statysreqgister retten 

Accu. AR. TR als Ergekrnisse der SYv3-Rautine 
ujeder nach LVOE,. 0... r82) speichern 


st=tusfla4=2 nach 275) bringen 


213 


Er 


BASIC-Routine SAWE 


57686 JSR 
357639 LD* 
57691 LDY 
57693 LDRA 
57695 JSR 
576993 BCS 
Srrea RTS 


#43 
65496 
537593 


> Parzmeter fuer 5AWYE lesen 
Endadresse+1l fuer SAVE 


Offset fuer 168-Bit-Pcinter zuf Startadres 
> SAVE. speichern van Froarsmmen 
Fehler?” Izas weiter kei 57397 


BASIC-Routine LORD/VWERIFY 


57781 LDA 
S7703 BIT 
57784 LDA 
Sr v’a6 STA 
57788 ISR 
57711 LDA 
57713 LD« 
57715 LDY 
57717 JSR 
S7’728 BCS 
s7722 LDA 
57724 BEO 
s7726 LDX 
57728 JSR 
57731 AND 
57733 BNE 
37735 LDA 
57737 CMP 
57739 BEQ 
57741 LDA 
57743 LDY 
57745 JMP 


57743 RTS 


S7743 ISR 
57752 AND 
7754 BEO 
s7756 LD%“ 
37758 IMP 


S7’7’e1l LDA 
57763 CMP 
37765 BNE 
577867 ST%« 
57769 ST’Y 
7771 LDR 
57773 LDY 
57775 JISR 
57773 JMP 


7781 JSR 
57784 JISR 
57787 JIMP 


BASIC-Routine OPEN 


7798 ISR 
57793 JSR 
37796 BCS 
57798 RTS 


#1 


537748 
4100 
#163 

43306 


55463 
#131 
Ssvrel 
#22 
42037 


123 
#2 
Ssv’8sı 
42 

46 
#113 
#163 
+23306 
42282 


42538 
42291 
42615 


7891 
65472 
579349 


Einsprungag Fuer "ERIFY 


Einsprung fuer LOAG: 
entsprechendes Flas setzen 


> Parameter fuer LOARD-/YERIFYF lesen 


Flas fuer ’YVERIF'Y" 

Zeiger auf Anfang des BASIC-Bereichs 
fuer RApprend nach ı8RrrR> kringen 

> LORD, Load und Yerifv von Proar ammen 
Fehler? Ja: weiter bei 5730993 
Verifv-F139 

gesetzt? Nein: weiter kei 
Code fuer "WYERIFY" 

> REROST,. IvO-Status in Accu bringen 
Bit 4 <Nichtuekereinstimmung? gesetzt? 


s7’74 


'D 


Ja: Aussske "WVERIFYT ERROR", weiter bei 57 


CHRGET-Pointer low «sollte wahl 123 “high 
= 2? (Direktmadusakfrage, kei lou jedach 
Jas RTS (sollte BNE sein) 

Accw’YR) := 41828, Startadresse „on "Ok." 


> Rusqaake der Meldung 


> REACST. I/O-Status in Accu kringen 

Bit fuer End or Identifv loeschen 
sonstige Bits gesetzt? Nein: weiter hei I 
Cade fuer "LORD" 

> Ruszssgake Fehlermeldung, RERENY. 


CHRGET-Pointer hiah 

= 2 «Direktmodues)”? 

Nein: weiter bei 77851 

Zeiger auf Ende des Froaramıms setzer 


‚Acc yYR) 3= 413465, 5Startzdresse von "RER 


> Meldung susgehern 

> CLR, Linkpcinter setzen. Einrgabewartesc 
CHRGET-Pcinter ruechksetzen 

Linkpointer setzen 

RESTORE : Feset Descrirteorindex. Stack: 


VYIWV 


> Parameter fuer OPEN lesen 
> OPEN, spezifiziertes File wetfnen 
Fehler sauf@setreten?” 1a: weiter bei 


214 


- Zr SSE 


se in (43443) 


58 
>» sein? 
unsirmig> 


rei 


Cr. n 


hleite 


CONT sperren 


Br 


BRSIC-Rautinre CLOSE 


7799 
378892 
Ss’sad 


7807 
378093 


SI+ BH=S1Ic "zZ 


JSR 
LOA 
JSR 
BCC 
JMP 


Parameter 


S/’s12 
S5r’s1d4 
579317 
578193 
97821 
57324 
7827 
57338 
37833 
57336 
378393 
37948 
37343 
57946 
57849 
37854 
57851 
37853 


537356 
378593 


57862 
57865 
57857 
57868 
57369 


7878 
37873 
37876 
357878 


LDA 
ISR 
LD* 
LO 
JISR 
ISR 
ISR 
ISR 
ISR 
LO 
sT# 
ISR 
JSR 
’SR 
TA 
TAr 
LD« 
JMP 


’SR 
JMP 


ISR 
EBENE 
PLA 
PLA 
RTS 


JSR 
JSR 
BNE 
JMP 


Parameter 


57881 
57383 
373936 
57889 
37892 
37874 
537835 
57897 
37893 
57902 
57995 
579983 
57918 
57912 
57914 
57916 
57918 
57919 


LDA 
JSR 
JSR 
ISR 
ST“ 
TARA 
LD« 
LDY 
JISR 
JSR 
JSR 
ST» 
LD'Y 
LDA 
CPA 
BCC 
DEY 
JSR 


fuer 


fuer 


44797 

121 
7869 
44303 


40 
52469 
7373 
4rans 

"3 


#1 
4a 
85466 
37962 
373585 
r4 
40 
73 
#3 
57313 


659455 


"LORD”,. 


“OPEN” 


>» Parameter fuer CLUOSE lesen 


Filenunmmer in 


-, 


. 


BR 


Laerae Filename 


- 
. 
- 


CLOSE. File 
Fehler aufgetreten” Nein: 
1.QO-Fehlerkehandlunreg 


"SAYE” 


und 


SETNAH, 


Festsetzung Farzmeter fuer :Filename 
Ersatzparameter fuer Primseradresse 
Selamndaer adresse 


"YERIFYT 


Accu krirgen 
Nummer im 


lesen 


Acecu) 


RTS 


‘Erzatzwert 


Ersatzpzar ameter fuer 
Festzetzunga P=zrameter fuer 


v 1, DR u 1 


SETLFS. 


zurueck 
Filenamen 
zurueck: 
naechsten 


zum 


zum 


Pzrasmeter 


Ersatzesr ameter fuer 


SETLFS. 


zurueck 


= 


hliessen 


uekergecardgrneten Rautine. 
lesen 
uekersecrdreten Rautine, 


OPEH 


falls 


falls 


-Geraetenummer)> lesen 
Selzundser adresse 


Festsetzung Farameter fuer PEN 


zum 


naechsten Farameter 


Ger aetenummer 


sonst Ruecksprung zur uekersecardneten Reautine 


> CHECOM pruett. 


SETLFS. Fests 


ygekergecordneten Rautirne . 
 Sekiundsaer acresse ) 


falls 


etzung Parzmeter Tuer OPEN 


rrueft zuf Komma und Nichttrernzeichen 
GETBEYT liest Z=ehl ins R 


Trennzeichen?” Neins RTS 


ok Ko 


> CHRGOT halt letztes 
Trennzeichen”? 


- 
> 
nd 


urıd 


Laermge Filensme als 


"SYHTAH 


"CLOSE” 


> SETHNAM. 


- 
„ 
‚ 


Filenummer- 
Ersatzpar ameter 


pruett 


Hein: 


ERROR" 


lesen 


zeic 


hen 


cms Foalat 


zZeic 


RT 


her 


Ersatzprar ameter 


Recorder > 


Trernzeichen 


Trernzeichen 


Trennzeichen 


lesen 


Festsetzung Ferameter fuer Fiılenzmer 
auF Komma und Nicht-Endezeichen 
> GETET liest Filenummer 


in 


Accu krinaen 


inz 


Ar 


fuer Ger zetenummer ÜFKe 
Sekundaer adresse 


Ersatzparameter fuer 


- 
„’ 
-, 
., 
„ 
7 


Erszsatzrar ameter 


SETLFS 


‚r 


Festsetzung Far ameter 


zurueck zur 


naechster 


Par zmeter 


Tuer 


fyer 
uekersecndneter, Rautine. 


. Ger zeterufmimer > 


eingeaeherne Filenummer 
Ger seterummer kleiner 


Ja: 


> 


SETLFS. 


weiter hei 
Ersatzyar ameter 


37919 
fuer Selkaundzer: 
Festsetzung Par 


215 


ar 


Sselaundseradr 


=.ch- 


zymetenr Hı 


22 


e22© 
Je 


DPF 


r 


a+mon 


a ı) 

If 

_ 10 

in Ru 
Re 


AT 


t 


1 


Edate) 


- OPEH 


: Trennzeichen 


(Bi &S57+ BrHzIc zZ - - - - - - De re 


Parsmeter fuer ”’OPEN” und "CLOSE” lesen “Fortsetzung? 


7922 ISR 57962 > zurusck zur uekeraecrdneten Rautirne, falls Trennzeichen 
57925 JISR 378586 > naechsten Parameter (Sekundseradresse) lesen 

Ssr’928 TARA 

7929 TAT Sekundsaeradresse ins "TR 

5rY339 LD&S v4 Geraetenummer in #R 

SY932 LDOA 2 Filenummer in Accu 

573934 ISR 9 65456 > SETLFS. Festsetzung Pzrameter fuer OFEN 

Ss7937 ISR 578682 >= zurueck zur uebersweordneten Routine, falls Trennzeichen 
57940 ISR 578978 > prueft auf Komma und Nicht-Endezeichen 

SY943 ISR 0 44d4ds = FRMEY/L. Auswertung von ARusdruecken 

SY9d46& ISR 46755 >= FRESTR, prueft. ak Stringvariskle: Str inwerwal tung 
7349 LDE 34 Sstartadresse des Filenzmens “Laenge im Accu) 

7951 LDY X te) 

37953 IMP 65453 > SETNAM. Festsetzung Parameter fuer Filenzmern 


BERSIC-Funktiaon COS 


Sr aaa LOA 4224 Acc RR) = Ssase,. Startadresse van PILZ 
s7358 LDY 4226 j 
Srg9sda TSR 2 JYrzar > FAC := Kanstante + FRC 


BA=ICL-Funktion SIMN 


SY7953 ISR 2 4dö1da = FRC nach REG vekertrasen 

=r985 LDA #223 Acc tR) = 530935. Startadresse von 2#Pl. Periodenlisaenge 
57358 LDY #226 

vrara LOS 11a “"orzeichen „ar ARG z1= Wert Fuer VYarzeichenverknuepfung 
srv972 ISRB 473793 > FAC := FRC Konstante 

S79732 JSR 43140 >= FRC nach REG uekertrasen 

arY979 ISR 43332 > IHT. Nachkommastellen akschneiden 

S7Y981 LOA #0 

79333 STA 111 lert fuer Yarzeicherwerkrueprtfung 

7335 ISR 47137 >= FAC = ARG - FRC “eraikt Nachkommastellen. Argument 


unde in Wert inmerhalk des Hauptdefinitionskereichs 
transformiert. FRC ernthaelt Wert geteilt durch 2Z#PI> 


SYI3SS LDOA #234 .AccuYR) = ISa9G, Startadresse san G.25 
Sr 32a LDY #225 

217,332 ISR 47134 = FRC = Konstante — FRAC 

7335 LOR 102 ‘erzeichen san FRC 

avr39T7 FHA 

r79395 BFL 2 58013 pce=ziti.? ITas weiter kei I5013 

ssaada ISE 47177 > FAC := R.5 + FRAC 

=saa3 LER 1a2 “Vorzeichen van FRÜ 

ssaas EMI Ssals nesatin,? Ja: weiter bei 35416 

sag” LOA 18 Fl=a4 fuer Yarzeichen invertieren 

2aa9 EOF 4252 

=g2@11 STA 15 

ssal3 ITSRE 49076 > FRC := -FrHü 

Sgals LOA #234 Accu VR) := Saga, Startadresse vn 9,25 
ssal=2 LO 4225 

Sagze ISR drz2ar7 >= FRÜ := kKanstante + FRHC 

ade FLR 

=omz4 BF 0259029 

adzs I5SR 49078 > FRÜ := -FHAC 

ae OR 4239 Acc R) 3= 58095, Startsdresse fuer Palvnomauswertung 
24331 1.6 #225 

af? IM oO Sri! > Falvrncamauswertung 


216 


C- Pr sS:—+ FRrRSIcl Vz Pr = = Pe = ö ISO 23€ 
BASIC-Funktiaon TAN 

5839036 JSR d4sa7d > FRAC nach (87.....91> krinser 
58033 LDA #0 

ssagiı STR 18 “orzeichenflag3 auf positiv setzen 
58043 JISR 357963 > SIN 

58046 LDX #78 .xPBVR) = 78 

58843 LDY #4 

53054 ISR 57594 > FRC runden und nach {78....,82) bringen 
58053 LDA #87 EXRetTE) ı= 37 

53055 LDY #0 

53057 ISR 48034 >= X87 2... .91> nach FAC khrinsenr 
58088 LDA #4 | 
58962 STA 1a2 Vorzeichen van FRAC 

ssa864 LDA 18 YMorzeichenflas in Accu 

53066 ISR 38076 > FARC s= cos (FRC> 

58089 LDRA #783 

535071 LDY #0 

ssa73 IMP 47887 > FRC s= KL TE.....823 7 FRC 

s8907& PHR 

598877 IMP 59413 

Konstanten fuer triaconametrische Funktionen 

ssa898 129 73 15 213 182 1.570793633 PI.’2 

ssasS 131 v3 15 218 1852 &.28318531 PIxz2 

53092 127 a a [e) Ic .e3 

58495 5 Polvnamarad 
583096 132 234 Z& 45 27 -14. 2313947 

58101 134 408 vr’ 251 248 42. aa 7a 71 

ss1a& 135 153 194 137 1 -75. 7041703 

ssı1l1l 135 359 33 223 225 81.8052237 

ssille 134 1655 93 231 48 -41.341 7021 

58121 1351 73 15 218 182 &.23318531 PI#2 


BRSIC-Funktion von 


Ssslz& LDA 
53128 PHR 
58129 BPL 
58131 JSR 
58134 LDA 
381365 PHRA 
58137 CMP 
581397 BCC 
58141 LDR 
53143 LD'Y 
58145 ISR 
58143 LDA 
5815a LDY 
58152 ISR 
58155 PLA 
58156 CHP 
581593 BCC 
ssisa LOR 
531862 LDY 
581654 ISR 
581867 PLA 
58168 BPL 
5s1r78 TMP 
58173 RTS 


102 


8134 
4975 
37 


#123 
Ss8148 
#188 
#195 
47937 
#62 


#227 


Svq4il 


4129 
59167 


ATH 


Yarzeichen van FRC 


pasiti? Nein: weiter bei 38134 
= FRC -FRi. 
Expanmentkute von FAC 


FAC kleiner 17 
weiter bei 8148 
"Acc tR) = 4yYS4S, Startadresse 


Ja: 
.cH 1 


= FRÜC : 


N = 1 “ 
Accu TR) 


FRC 


=ss174. Startzdresse fuer Pol nomauswer tur 


> FPalvrcmauswertung 


Araument kleiner 1? 


Jar weiter kei 73167 
Accu R) = SSasa,. Startadreszse van FI-2 
> FRAU = Kanstante —- FRC 


VYarzeichen des Arauments 
positiw” Ia: FT: 
>= FRAÜl s= -FRC 


217 


Ce S©S:4 BHS5SIc WwzZ - - - - - - 53174 


Konstanten fuer ATN 


ss1rg4 11 Polynomar ad 

S817S5 118 179 131 1893 211 -65. 3479391 2E-R4 Koeffizienten 

selsa 121 30 244 166 245 4.850942 16E-A3 

58135 123 131 252 176 18 -9.01651117018 

57813998 124 12 31 1093 202 a. 034209638 

58195 124 222 83 203 193 -0. 05427913283 

Ss294 125 za 1a 112 76 a.072457193653 

ss205 125 133 234 981 122 -0. 0393023954 

se21a 125 99 43 136 126 9.1109324123 

598215 126 146 68 153 58 -9. 14233930483 

Sse2zza 126 ve: 204 145 199 0.13999912 

393225 127 ira 17a 170 193 -0. 333333316 

s3230 129 a a a a 1 

53235 ISR 65494 >= ELRCHN. aktive I’D-Kansele schliessen 

532233 LODA 4a 

3240 STA 19 Tsstatur als sktiven Eingabe-Kanal 

53242 ISR 426518 > Descrirptorindex und Stack ruecksetzen; CONT sperren 
s8245 CLI 
as2d6 LOK #123 Code fuer Rusgake van "RERDY." 

53248 JMP 768) Narmalwert .des Yektors (7687769): 58251 

23251 TARA Fehlercade in Accu (S5Statusflags setzen? 

53252 BMI 583257 Bit 7 gesetzt? Jar weiter bei 593257 

8254 IMP 42042 > Ausgabe Fehlermetidung, Einraabewarteschleife 
58257 IMP 42100 > Rusaake "RERDY.", Eiraakeusrteschleife 
BASIC-Reset 

egz8d JISR 58451 > Sprımngwektartakelle (768,...,rr9> initialisieren 
53253 JSR 58303 > Yekteren etc. fuer BASIC initialisieren 
926565 ISR 593402 > Rusasake Reset-Heldung 

326589 LOS #251 

Sss2r71 TXS Stackprcointer initialisieren 

aa27Z BNE 358246 Inkedinater Sprung zur Rusaabe van "RERDY.", etc. 


CHRGET-Routine (wird zusammen mit END-Wert nach “113-.....1943> kopiert) 


Zenra-Flas4 ist gesetzt. falls Trennzeichen «A oder 593> gelesen wurde 
Carrv ist gelcescht. Falls Ziffer (423 bis 37) gelesen wurde 


58274 INC 122 CHRGET-Fointer lou erhoehen 

Sg276 BNE 78284 

sszr2 INC 1223 CHRGET-Pcinter high erhoehen 
aszaa LDA Saar hier steht die zu kearkeitende Adresse fuer BASIC 
2S232 CHP #32 gelesener Wert > 57 “keine Zahl»? 
29285 BCS / 5393297 Ja: RTS 

33237 CHP #232 Leercode” 

22253 BED Sad . Jas naechstes Zeichen lesen 

22231 SEC 

REIHE SBE #43 setzt Larrv. falls Code {I 43 
=3234 SEC 

2295 SBE #20Q 

332937 RTS 


Aufzllsrzahl Fuer FHl sach dem Einschalten 


218 


En 4 PFRS>Ic zZ - - - - - - ame — a 7 Be | 


Sprunswel:taren. Fointer und anderes fuer BRSIC initialisieren 


s834a3 LOA #7& Code fuer IMP in 

ss3aS STAR 34 Yektor fuer Ruswertung von Funktionen, 

53397 STA ra4 Yektcaer fuer BERSIC-Funktion LSR bringen 

5310 LDA #72 Accu TRI = 45840, Ausaabke von "ILLEGAL QURNTITY ERROR" 
58312 LD’Tr #178 

s32314 STAR 785 als Kennzeichnung fuer nichtdefinierte USR-Funktion 
58317 STY 736 

ss32@ LDA 4149 Accu RR) ı= 453969, Startadresse fuer INTFLP 
53322 LDY #179 

se324 STA 5 in Yektor fuer INTFLF bringen 

53326 ST’Yr & 

s8328 LDA 4170 -Accu/TR)> := 45482. Startadresse fuer FLPINT, 
58330 LDY #177 

53332 STA 3 in Yektor fuer FLPINT kringer 

538334 ST’ 4 

SS336 LO% #23 

s8333 LDA 753274 .% CHRGET und Zuf2llszahl fuer RND van 133274 ,...,98292) 
53341 STA 115.8 nach £115S,...,.1943> bringen 

58343 DE# 

se344 BPL 333383 

9323465 LDA #3 

s82348 STA 82 Schrittweite fuer GARBEAGE COLLECT 

SS354 LOA #4 

s8352 STRA 104 . 

S8354 STA 193 Tastatur als al:tiven Eingake-Kansal 

s8358 STA 4 Brte hiah des Pcinters zuf letzten String 
53353 LD% #1 

sg38A STx sa3 Linkpcinter zum Einkau von Praourammzeilen 
sge383 3TXS saS3 in BASIC-Bereich “nal. 42274) 

s8366& LOK #25 Descriptorindex initialisieren 

58363 STH 22 


sesra SEC 

3371 JSR 0 &5436 > MEMBOT, Lesen des Speicher anfangs 
s33r74 STE 43 und nach £42”434>) kringen 

sS376&6 STTr 4 

58378 SEC 


sa372 JISE 65433 > MEMTOP. Lesern des Speicherendes 

s8332 ST SI nach 1.599656 3 bringen 

58334 5T'Yr I5 

s3386 5T# 1 nd als Strimnsapointer nach (517525 bringen 
583353 S5TYr SZ 

sF394a LO'Y 44 Code Null 

S8392 TrA 

s3393 STA DI SC u Zn in er=zte Stelle des Arkeitzsspeichers kringen 
53235 INC +3 und Zeiger auf Antara BASIC um eins erhoehen 
38397 EBENE Tadel 

3339393 INC 44 

s3401 RTS 


Mus4ahke Reset-rPelcdurnga 


eädaz LER +3 Feinter zuf Antara ERSIC-Bereich 

344 LO 34 

aaa ISR 4139 > Te=st. ch serua Platz im Arbeitsspeicher 

sa4a3 LORA #11% "Accu R) 3= 58423, Startadreszse van "COMMODORE 84 „.." 
5411 LOW #222 

s541> I5R 0 J4aacs = Meldung zues4eken 

s241r LOR bake Pointer zuf Ende des Arkeitzspeichers 

7413 SEC 

24193 SEC +2 minus Fointer zuf Besinn des Arkeitsspeichers 

=e4-r Tre 


219 


CeEn 54 BRSIC 


Rusaske Reset-Neldurg 


32422 
293424 
93426 
38429 
59431 
58433 
38436 


LODA 
SBC 
JSR 
LDR 
LDY 
JSR 
JMP 


et 

44 
48589 
#96 
4228 
4238096 
425654 


Naormalwerte der 


533439 
5a441 
58443 
38445 
59447 
33449 


58451 
593453 
53456 
53459 
53468 
39452 


53463 
Sss454 
398477 
58433 
33494 
33547 
s8521 
59531 
333408 


S9I41 
SSI342 
58545 
5935485 
9547 
39549 
S335g 


I853E 
33539 
59591 


58592 
59594 
59596 
59597 
58599 
58601 
53643 


3504 
5s614 


139 
131 
124 

26 
228 
134 


LDS 
LORA 


Vektceren van 


227 53251 
154 42113 
165 ° 42364 
167 42773 
167 42980 
174 44675 
#11 
53439 .9 
,68.8 
33453 
[ST Ss re Er = c 
Ss2 6869 69 
13 32 32 
‚3 777 
85 83 73 
32 54 52 
8s3 83 934 
85481 
ISIS 
iva 17a 170 
ira ıiva 17a 
33281 
2433. 
#2 
145 
3803 
161 
39594 
38 688 25 
5 209 = 


Be — In ee 


Fortsetzung? 


ersikt Fnzahl freie Bvtes 
> Zahl ausgeben 
Accu ’R > S9d46ö4, Startadresse von "ERSIC BYTES „.." 


> Meldung ausgeben 
NELI 


‚68 kis 779 


fuer ERROR 

fuer BASIC-Einuvskeschleife nach 
fuer Umwandlung in Tokens 
Yeltar fuer Rusgakbe „an Tokens KLIST> 
Yektar fuer Interpreterschleife 
Auswertung von Rusdruecken {FRMEVYL> 


Yel:taoar 
Vektor 
VYeltor 


"RERD'Y." 


Vektoren won (758... . ,.17179> initizelisieren 

3 86 32 565 39 34 6869 93 32 BASIC BYTES 
13 a FREE 
s2 32 42 42 42 42 32 BE Fo 
‚9 683 79 82 89 32 54 S52 32 COMMODORE &4 
67 32 8 Sa 32 42 42 42 42 13 BASIC Ya Brk 
‚Ss 32 82 85 77’ 22 ed4k RAM 

9 Tr’ 32 32 a SYSTEM 

Rcecu merker 

> CHEKOLIT. Rusyakeuvaorkereitungen 

eventuellen Fehlercade ins #R 

Hccu wiederherstellen 

Fehler?” Nein: FRTS 

Fehlercode wiederherstellen 

ira ıiva ıiva Ivyva 1va 17a 

iva Ira iva I\vya Ira 1ra 

Backarcund-CLolcor al: Farkwert 

der Cursorpositioan speicherrn 

Accu + Carrv + Do 4 2565." 650 Sekunden warten 

Flaa fuer diverse Tasten in "FR kringen 

Taste vedrueckt? 

Ja: RT=S 

zeit „orkej ” 

Nein: warten .„.. 

2 ir 232 13 112 12 Tinerkonstantentskelle fuer Ffi 
Sa 1 174 a 1an {8} „al. Baal +. BIEIS FF 


CErI 2 BShHhsliIc "zZ = = = = en 
IOBASE, Webkergake der Startadresse der IRÜ-CIR in SKRTR> 
59624 LD# 40 sFr E> ı= Sb3za 

ss625 LDY #220 

58628 RTS 


SCREEN. Uekeraske des Bildschirmformats ir 


33529 
23631 
39633 


PLOT. 


59634 
3636 
39638 
s9644 
33643 
336453 
53647 


N ed 2 


LDS #440 
LDY #23 
RTS 


Lesen und Setzen der Cursarprcsition 


BCS SF85423 Carrv vesetzt? Ia:ı weiter kei 58643 

STA 214 Cursarzeile- 

sTr zii Cursorspalte setzen 

JISR 58732 > zugehcoserige Zeilenparsmeter =ktuzlisieren 
LO“ ld Cursorzeile- 

LO'Y 211 Lursorspalte lesen 

RTS 


Screen-Editar-Reset 


536483 
539651 
336853 
I98JI6 
38633 
S3664 
59653 
3669 
39668 
53674 
293673 
IS678 
93678 
9681 
59533 
39635 
95939 
III 


58692 
58695 
58597 
58598 
ssraa 
seral 
58793 
sgra4 
S87a5 
SSrag 
53799 
sg71a 
ss712 
59714 
58716 
58718 
53728 
58723 
53724 


initizslisieren 


freimekesr 


krinsen 


al= Einfach- 


sezschehern 


JISR 337934 >= aktive 1Tr’ü-Kanzele und Yideo-Chip 

LOA #0 

STA a Fa CBM-Taste ikKleinschrift/’Graphik-Umschaltung> 
sTA 2a Lursaor in QDunkelrhase 

LDA #72 

sta 555 EI = ale, Vektor fuer Tastaturakfrause 
LDA 4235 

STR [ta 1-1 

LOA #14 

STA &49 Maximale Groesse des Tastaturpufters 

STR 852 Zaehler fuer Anspruchszeit van REPERT 

LODA #14 

sTtA ed4E Mamentaner Curszsortarkwert 

LDA #4 

STR 551 Zaehler tuer Miederhalungszeit van FREFERT 
LDA #12 

STR 20° Z=aehler fuer Cursarkblinkdauer 

STR za4 Lursor ausschalten 

LOR E48 CLEAR SCREEN. Bildschirm loeschen 

IRA #123 Start=acdresse HKHiah desz Eildschirms 

TAY Bit ” setzen "Eintfachzei lenkennzeichruna? 
LOA #4 

TAxs 

STTr e1lr.® in T=kelle fuer MSE (Dcoppelzeilentakelle: 
CLC 

ADC 4404 zZeilenlaen4e addieren 

BCl. 337093 liebertr=247 Nein: MSB nicht erhoehen 

IN'Y 

IN“ 

CP“ #25 alle 25 Zeilen iriti=alisiert? 

BNE 53701 Hein: weitermachen ... 

LDA #255 zsallte wohl Kennzeichrmng der "25. Zeile” 
sTA 217. zeile sein. ist jedach bereits „arher wesc 
LOX #24 Bildschirm loeschen 

JSR 59943 Zeile (Hummer im KR) lcoeschen 

DEXx 

BPL 358724 


221 


CE 54 BRS>SIC WzZ - - - - - - 


Fa’ 25 


HOME. Cursor in linke obere Ecke 


S857285 LDY ya 

3728 STYr il Lursorspalte :ı= B 

393734 ST'r 214 Cursorzeile := 8 

Zeilenparsmeter sktualisieren 

33732 LDX 214 Cursorzeile ins XR 

58734 LDA ei1i Cursorspalte in Accu 

3736 LDY e1lV’,® MSB=z fuer Doppelzeilen 

58738 BMI 58748 Einfachzeile? Ja: weiter kei 583748 
Ssr4a CLC 

55741 RDC #440 Lursorspalte um J@ erhoehen 

58743 STR il 

S98745 DES um eine Zeile zurueckgehen 

3746 BPL 33736 und weiter zugehneriae Startzeile der Doppelzeile suchen 
38748 LDA e17.8 209.210) auf erstes Zeichen der Cursorzeile setzen 
55750 AND #3 

53752 ORA E45 

38753 5TRA 21m hiah 

53757 LOAR 864556 .% Takelle der LSBs fuer Bildschirm 
Ss7eA STA za low 

58782 LDA #39 Zejlenlzenae fuer Rintfachzeile 

sS7&4 INS 

37653 LDY 1”. Eintachzeile? 

=S787 BMI 393775 Ja: Zeilenlasenge speichern, RTS 

5376893 CLC 

sevvra ADC #40 49 =ddieren 

Ss772 INS eine Zeile vorgehen 

Se7r723 BFL 58765 amd weiter n=ch letzter Zeile der [Ucppelzeile suchen 
58775 5TRA 213 Zeilenlsaenge speichern 

SSYTYT7 RTS 

aaryYS8 JSR 55734 > aktive Irü-Kanaele und Yideo-Chip iritialisieren 
53731 IMF 53726 > HOME 

28734 LDA #73 aktiven RAusasabe-kKanal 

s378E STR 154 auf Bildschirm setzen 

SEr73=8 LDR #6 akti.en Einasabe-kanal 

sera STA 133 auf T=a=st3atur setzen 

S732 LOx* #447 

53794 LOR Sasaa,H 

sr” STA 532947.% Fesister des Yideo-Contrallers setzen 
sasaa DEE 

see] BNE 35794 

S335RA3 RTS 


= 
yı 
in 


tatunrmufter abkhzuer 


sed I_LDıY rl erste=z Zeichen de=z Kevbcaardbuffer=z 

sgSa7 LOK 44 

32303 \.DA BIz.M Zeichen in Keukoardkuftfer 

e3l2 >STA E21.5 um ejnmz Stelle nach unten verschieken 

22315 INS 

ga1e CF 198 kis alle weltisen Zeichen erreicht 

SFR EHE 78503 

ar DET 138 Zaehler fuer Anzahl Zeichen um eins vermindern 
ade Ti Accu enthaelt mn Zeichen aus Tastaturpuffers 
Zes2.ı: CI 

Aagrd LLC 

nt. 25 FT 


222 


CB 84 BRSTIC 


ne L_ [3 2 [ } mu = 


5332& 


Marteschleife Fuer CHRIN 


28826 
39329 


39831. 


38333 
593336 
33333 
39339 
592341 
399343 
39345 
ISS4E 
kat = Tate 5) 
59352 
ket= the te 
39359 
ISA 
393682 
S364 
583653 
58367 
s3F7a 
393373 
sg74 
33376 


33378 
JH334 


Zeichenuekerrnahnme ch 


589332 
53594 
23338 
SSSIE 
39894 
93532 
39393 


N 
AU 
ei 
eb 


DM Be Ba A Ba Er, BR BA BE 
wa 


SR 
LOR 
STA 
STA 
BEO 
SEI 
LODA 
BEQ 


LOA. 


LO“ 
LDY 
ST'’r 
ISR 
ISR 
CMP 
BNE 
LD« 
sEI 
sTt« 
LOA 
STA 
DE“ 
EHE 
BEQ 


CHF 
EBENE 


LD'Y 
STr 


391538 
19383 
204 
838 


. 59329 


207 
59353 
206 
547 
#0 
207 
39323 
93344 
#131 
33578 
#93 


198 


gsas4s,% 
538.% 


39967 
53329 


#13 
33326 


{N 
u) 


Dip Pa po Ra an Au 
9 a a u ze «) 


Wide Pe 


= 


> Ru=sgabe eines Zeichens auf den Bildschirm 

Anzahl Zeichen im Tastaturpuffer 

Cursor einfausschalten 

Insert Enakle (bei Zeilenueberaanda neue Zeile einfuegen? 
keine Zeichen im Tastaturpuffer? Ja: weiter warten 
Interrupt verhindern 

Cursor hell? 

Neins weiter bei 53355 

Zeichen unter Cursor 

Farke unter Cursar 


Cursor dunkel schalten 

> Zeichen in Bildschirm-RAM bringen 
> Zeichen aus Kevkasrdkuffer holen 
Eode fuer "Shift-RUNSTOF"? 

Neins weiter kei 53878 


3 Zeichen in Tastaturpuffer krirgen 
.LDOAD" CR "RUN" CR 


RETURN? | 
Neins zurueck zur Eingaskeschleitfe 


Bildschirm 


Lzenge der momentanen Zeile 

Fla3 fuer "RETURN" setzen 

Yom Ende her Zeichen vam Bildschirm lesen 

gleich Space? 

Nein: weiter kei 53395 

Zaehler verminderr 

und weitersuchen 

Zaehler erhoehen und als 

Zeiger hinter letztes Zeichen der Zeile speichern 
Inzeert Disakle 

‘kei Zeilenuebersang kein Einfuesen van Zeilen) 
Lursorpceeition :ı= 8 

Fla4 fuer Anfuehrungszeichen ruecksetzen 
Lurseorzeile beim Aufruf »on CHRIN bereits durch 
Scrolling verschwunden?” Ta: weiter kei 53938 
uırscerzeile ins R 

> Adresse fuer zugehoerisge Startzeile nach (209.2105 
wurde waehrend der Einwabke die Anfznaszeile werlassen? 
Jas ak erster 5palte der neuen Zeile lesen 
Cursorspalte hei Rufruf „on CHRIN 

in Lursaorspaltenpcointer bringen 

mit Index fuer Anzahl gueltiger Zeichen vergleichen 
Kleiner: Zeile zuswerten. weiter kei 793938 

Goroesser ader qleich: Leere Eingake, weiter kei 393973 


223 


ul — 1 22 | 


+ PeHnz=sıIc 


IR ber, 


— . = au = [0 [; 


Einstieg fuer CHRIN „am Bildschirm 


58934 
589231 
53932 
58933 
53934 
SS9I38 
58938 
59940 
53942 
58944 
53946 
53948 
Sg950 
58952 
53954 
SSI3E 
8958 
28968 
53962 
3964 
SSI6E 
52969 
8971 


39973 
38975 
53977 
533979 
33981 
589933 
33985 
339837 
58939 
Se391 
593994 
389965 
383998 
3333 
598009 
Sssoa1 
59082 
s>0a4 
Spaa6& 
59808 
7010 
S9all 


Umschalter 


Sol 
ssa1d 
Saale 
33013 
590208 
saa22 
saa24 


TrPA 
PHR 
TARA 
PHR 
LOR 
BEO 
LDY 
LOR 
STR 
AND 
ASL 
BIT 
BPL 
ORA 
BCC 
LD# 
BNE 
BVS 
ORA 
INC 
JSR 
CP'Y 
ENE 


LDA 
STA 
LDA 
LOS 
CP*s 
BEQ 
LD*S 
CP» 
BEQ 
JSR 
LDA 
STR 
PLA 
TAs 
PLA 
TAY 
LOA 
CMP 
BNE 
LDR 
CLC 
RTS 


CMP 
BNE 
LOR 
EOR 
STA 
LORA 
RTS 


208 
33329 
e11l 


20933 ,Y 


215 
#63 
213 
215 
33994 
#128 
IS96H 
e12 


Sg964 


se964 
#54 
2il 
S9a12 
280 
33325 


#0 
2a8 
#13 
153 

#3 

58991 
154 
#23 
53994 
39158 
#13 
215 


e17 
#222 
3010 
#255 


Indexresister retten 


noch Zeichen vorhanden “Zeile nicht komplett gelesen)” 
Neinss zurueck zur Warteschleitfe,. weiter kei 58329 
Cursorspalte als Index ins TR 

Zeichen vom Bildschirm lesen 

vom Bildschirmceode in RSCIT umwandeln 


Bit & im BSC gesetzt? Nein: weiter kei 53954 

Bit 7 im Zeichencode setzen 

BSC graesser 127 “Resers)>? Nein: weiter kei 539650 

Fla4 fuer Anfuehrungszeichen ader Bit 5 im BSC Yesetzt? 


Ja: weiter bei 339684 

Bit & im Zeichencade setzen 
Pointer fuer Lursaorspalte erhcehen 
> Anfuehrunaszeichen pruefen. e.tl. 
letztes Zeichen gelesen? 

Neins weiter hei 53996 


Qucate Modus setzen 


Flau4 fuer "Zeile komplett gelesen" setzen 
Code fuer "RETURN" als Kennzeichnung fuer Zeilenende 
aktiver Eingaabe-Kanal 

= Bildschirm” 

Ja: weiter kei 598991 

aktiver Rusgake-Kanal 

= Bildschirm”? 

Ja: weiter kei 593994 

>= Zeichen zuf Bildschirm aussehen 

Code fuer "RETURN" 

in Register fuer letztes Zeichen krinaen 
Indexresister „cam Stack halen 


gelezsenes Zeichen „aleich Jem 

RSCII fuer PI? 

Nein: tertiy 

ASCII fuer FI durch BASIC-Token fuer FI ersetzen 


fuer Quote-Madus 


#24 
bar 1 Pen 
212 
#1 
212 
#234 


Code fuer Anfuehrmungaszeichen?” 
Nein: FTS 


Fl293 fuer YBucote-Madus imvertieren 


Code fuer Antfuehrungszeichen wiederherstellen 


224 


C-BS5r ©&©+ BEHRSIc W2Z - - - - - - Ze: 


Zeichenausgabe skschliessen “mehrere verschiedene Einspruenge) 


39925 
59927 
592293 
59931 
59a33 
59035 
59437 
590939 
59842 
59045 


59948 
59949 
5390568 
59052 
59854 
S59056E 
39057 
599583 
59959 
59068 
59861 


Cursor weiterkewesaen ,. 


59862 
390965 
59067 
590693 
59971 
59473 
59975 
59077 
59080 
59982 


590835 
59987 
59089 
590891 
59094 
IIAIE 


39993 
59199 
593182 
59193 
59105 
59187 
591089 
59118 
59112 
59113 
59115 


59117 
59119 
59121 
59122 
59124 


ORR 
LD< 
BEO 
ORA 
LD< 
BEN 
DEC 
LDA 
JSR 
JSR 


PLA 
TA’Y 
LDA 
BEO 
LSR 
PLA 
TAX 
PLA 
CLC 
CLI 
RTS 


JSR 
INC 
LDA 
CHMP 
BCS 
CMP 
BEO 
LDRA 


#64 
199 
SAA33 
#123 
eil6 
520393 
216 


546 . 


539323 
S99652 


elle 
S9O5E 


el2 


9127 

658 
>9a35 
59751 


214 
#23 
S9a98 
9625 
214 


Bit & im Zeichencode setzen 

Flaas fuer RYS-Madus wesetzt? 

Nein: weiter bei 59433 

ansonsten Bit 7” (Revers, im Zeichencade setzen 
Insertzaehler 

= 8? Ja: weiter bei 596393 

Insertzaehler »erminderr 

sktueller Farbcode ins XR 

> Zeichen und Farke ausgehen 


Ly 


> Cursor weiterbeuegen 

YR wiederherstellen 
Insertzaehler 

= 8? Ja: weiter hei I945€ 


ansonsten Qucote-Modus ausschalten 
*R und Rccu wiederherstellen 


bei Bedarf nzaechste Zeile initialisieren 


> zeilenpointer erhashen. falls Cursor in letzter Spalte 


CLurscarspaltenrcinter erhoehen 

aktuelle Zeilenlaenge 33 ader 73) 

mit Cursorspalte Vveraleicher 

letzte Spalte yekerschritten?” Hein: RTS 

kereit=z Doppelzeile” 

Jas weiter kei 39127 

Zeilenuekeraana: erfalate die Aussake des Zeichens 
im Editiermadus? Nein: weiter kei 734537 


> Foartsetzunazeile einfuesen. Rest nach unten »verzchiekern 


Lursorzeile 
kleiner ZI” 
Ja: weiter hei 9093 


> SCROLL. Bildschirminh=alt nach cben verschieken 
Lursorzeilenpointer vermindern 


Zeile ihHummer im #R> als Fartsetzungszeile markieren 


Folaezeile =al=z Startzeile markieren 


al. tuelle Zeilenlaenge 


um J@ erhoehen 


Doppelzeile” 

Nein: weiter kei 53124 

Index »verminder-r 

weiter zugehoerige Startzeile der ODcoppelzeile suchen 


- 


> Startadresse lau, Hiah der Staertzeile setzen 


225 


ud — I 20 | 


+ PEHSIc 


Bewegung aus Doppelzeile heraus. neue Zeile initialisieren 


53127 
591293 
S9132 
59134 
59138 


Rueckschritt in nicht 


39137 


29143 


DEC 
J5SR 
LOR 
STA 
RTS 


214 
97316 
#0 
e11 


Cyursorzeile vermindern 
> Zeile initialisieren 


Spalterpcinter ruecksetzen 


zum aktuellen Cursarzeile gyehserige Zeile 


Zeijlenpainter 

= 7? Nein: weiter bei 39147 
Spalterkaeinter auf erste Spalte setzen 
Ruecksprungadresse „om Stack halen 


Inkeadinater Sprung zum Akschluss der Zeichenzausgabe 


zZeilenpointer vermindern 
> Zeilenparsmeter aktualisieren 
_zenae der Zeile. in die Cursor keweq4t wurde 


als Cursorspslte speichern (letzte Spalte der Zeile) 


Rusagake eines Zeichens zuf Bildschirm 


391583 
317 
Sa1l6l 
=a1a2 
52153 
9154 
9159 


S>3167 
2169 
Sso1rl 
Ssoa173 
S9175 
2172 
9134 
S91SE 
31953 
Sa19r 
TI1ISI 
3131 
S2133 
23135 
13T 
33139 
SIzdz 
„9207 
u Per 5 Di 
mb 5 5 
ka Ber 
=3z21ld 
TREE 
Pe 
23213 
NFEEE 


FHR 
STA 
TARA 
PHR 
TrA 
PHR 
LDR 
STA 
LO 
LODA 
BRL 
IHMP 


LMP 
EHE 
IMP 
cnP 
BCE 
CMP 
BCC 
AHO 
EBENE 


AHE: 
ISFR 


: IMF 


Li 
BEI 
IMF 


Ü.pF 
ENE 
TrA 
EHE 
ISR 
TMP 


213 


EN 


DPI A 


Resister retten 


[R-Flas ruecksetzen 

Curzsorspalte ins "FR. 

Zeichencaode in Accu kringer 

Code kleiner 1237 Ja: weiter hei 597173 


> Sshittzeicher hbearkeiter 


"BETUFRN"? 

Hein: weiter hei 59135 

> Zeilemwarschukb, Flag ruecksetzen 

Code Lleiner 32 (Steuerzades)” 

Ja: weiter bei 53205 

Code L:leiner 967 

Jar keine Gr=pßhikzeichen, weiter kei 59197 
Eit 7 loeschen. Umwandlung in Bildschirmeode 
Inbedimater Sprung 


Bit & und ” Joeschen. Umwandlung in Bildschirmceade 
>= auf Anfuehrungszeichen pruefen 
» Zeichenausaske akschliessen 


Insertzaehler 
=@? Ia: meiter kei Il 
> Zeichenausaushbe =ahbschli 


"DELETE"” 

Heins weiter hei 79252 
Anfarasspalte 

=#? Nein: weiter bei 79229 


> Rueckschritt im nicht zur Cursorzeile gehcerige Zeile 


- Zeichen zu CGursarpcsition loeschen,. Abschluss 


226 


ne - - - - - - Ta127 


c-Er1 


+ 5H>Ic vw - - - - - = 


59225 


Rusaabe eines Zeichens auf Bildschirm (Fartsetzung? 


59225 
539228 
39223 
s9231 
s9234 
59233 
39237 
39238 
ss24a 
so241 
39243 
s9244 
59246 
s9247 
59243 
39251 
59253 
59255 
39233 
39268 


WSWDI ID NND UND DPD MDMDMMPIIRIM 
ASIATISCH 
nNEDS SIND R SS SITES WR 


Ic) 


PA] BIP | BL PA] BSH, BCE | BE] BB BU BO] BR ı Ba Ba Bu, 
FENDT EN SD AN BE werN 


fd Ip if 1) .£ Ir) KM) in Ne) 'ıo I) ıyı ıD ıD Ne} 
VE TEN IE EN ENTE 


N 


Gi ua ya PR RI Pi Pl ee ee u eb 


1 


JSR 
DE'r 
STY 
ISR 
INY 
LOR 
DEY 
STA 
INY 
LDA 
DEY 
STA 
INY 
CPY 
BNE 
LDA 
STA 
LDA 
STA 
BPL 


LD« 
BEQ 
JMP 


CHP 
BNE 
sta 
CMF 
BNE 
JSR 
CMP 
BNE 
IN’Y 
ISR 
ST'r 
DE'Y 
CP'Y 
Bil 
DE”: 
ISF 
LO’ 
STr 
IMP 


cMP 
BHE 
[Lil 
TraA 
ROC 
TAT 
IHC 
CMP 
BCC 
BED 
DEC 
SBC 
Bi 
STA 
BHE 


243). 


2.243). 


213 
3234 
#32 


[N [h 

'D Igı 

IN PO ia 
Letter Sm 


Dead did 


#40 


{N in 


N) If 


{ 
An) 


WIE Pa io ic pa fa 
Deut DD m - 
VDernDERrLuHh 


ın 
\ü 


> Pruefung, ob Rueckschritt innerhalk von Doppelzeile 
Cursorspaltenprointer vermindern 

und als neuen Spalterpcinter speichern 

> Color-Pcinter errechnen 


Alle Zeichen „an Cursaorposition kis 
Zeilenende um eine Stelle zurueckschieben 


ebersc die Farkcodes 


Endspalte erreicht? 
Nein: weitermachen ... 


letzte Position loeschen 
aktueller Farbcode 

ins Color-RRAM 

im Narmalfall unkedingter Sprung 


Insertzaehler 
= 9? Ja: weiter kei 39269 
> Zeichenausaske akschliessen 


"REVYERS DON"? 

Nein: weiter kei 39275 
Resers-Fla4 setzen 

"HOME"? 

Nein: weiter hei 59282 

Cursor in linke obere Ecke setzen 
"ZURSOR RIGHT"? 

Nein: weiter hei 59309 
Spaltenrpcointer erhoehen 

= Pruefung,. ck Cursor in letzter Spaltenporition 
neuer Spaltenpointer 


llekeryana im neue Zeile” 

Nein: Abschluss Zeichenausgake 
zeilenpcinter vermindern 
zrneye Zeile initialisieren 
Spaltenpointer 

zuf erste Spalte setzen 

>= Abschluss der Zeichenausgake 


"CZURSOR DON"? 
Nein: weiter kej 9342 


Zeilenlaerme zum Spaltenpcinter addieren 


Zeilenpcointer erhoehen 
neue Zeile erreicht? 


Hein: Schritt. innerh=lk von Dcppelzeile, weiter bei 59304 
zeilenpcinter vermindern 

Spaltenpcinter um da vermindern “Carry» bereits gesetzt) 
kereits genug dder suktrashiert? Ja: weiter bei 79336 
Wursarspaltenpaointer setzer 

md ein weiteres Mal ... 


227 


Bud — I 02 


Rusagake eines Zeichens auf Bildschirm “Fortsetzung ) 


39336 
393339 


39342 
59345 


ISR 
IMP 


ISR 
IMP 


375186 
59943 


59595 
504834 


> neue Zeile initialisieren 
> Abschluss der Zeichenausaake 


Contraolcodes fuer Farke pruefen 
weitere Zeichencades bearbeiten 


N ,} \! 


Bearbeitung der Shiftzeichen 


39348 
39358 
593352 
39354 
59356 
59358 
59368 


S9363 
59365 
99387 


59370 
39372 
sa374 
39376 
59378 
393308 
59332 
397394 
59386 
5393388 
39398 
39392 
59394 
39397 
33399 
Ss94a2 
39423 
9405 
S940E 
2943 
29409 
S9411 
59412 
59414 
59415 
59417 
573419 
s9421 
59423 
S9425 
39423 
9430 


53433 
39435 
39437 
59439 


9442 
592444 


AND 
CHP 
BNE 
LDA 
CMP 
BCC 
JMP 


CMP 
BNE 
JMP 


LD< 
BNE 
CMP 
EBENE 
LDY 
LOA 
CMP 
EBENE 
CPY 
BNE 
EP'Yr 
BEOÜ 
JSR 
LD'Y 
JSR 
DE'Y 
LOR 
IN'Y 
STR 
DE'Y 
LDA 
IN'Y 
STR 
DE'Y 
CPY 
BNE 
LDA 
STA 
LOA 
STA 
INC 
JMP 


LO 
BEQ 
ORRA 
JMP 


CMP 
BNE 


#127 
4127 
59356 
#94 


209) ,Y 


#32 
IZIA 


#232 


2997 ,'r 


S45 


2435 ,'r 


ele 
30483 


216 
52442 
#64 
saa31 


#17 
539468 


Bit 7 loeschen 

war es Code fuer PI” 

Nein: weiter kei 19356 

durch Bildschirmcode fuer PI ersetzen 
Code im Bereich von 
Ja: weiter hei 59363 
> Zeichenzausgakbe abschliessen 


Code fuer "Shift-RETURN'" 
Nein: weiter kei 9370 


> Zeilerwaorschuk. Fl232 ruecksetzer 


Quote-Modus eingeschaltet? 


Ja: weiter bei 39437 
Code fuer "INSERT"? 
Nein: weiter hei 594323 
Zeilenlaenge 

Zeichen lesen 

“Mleich "SFACE"? 

Nein: weiter kei 39394 


Lursorpcezsition erreicht? 

Nein :weiter kei 59397 

Zeilenlaernge bereits 793 “Doppelzeile)>? 
Jar Zeichenausgake =kschliessen 

> Fortsetzunaszeile anfuegen 

Zeilenlaendge 

> Colaer-Peointer berechnen 

zsaemtliche Zeichen vom Zeilenende Kiss zur 
um eine Pasition nach rechts verschiehen 


Farkocdes ekensc 


Curscorpasiticon erreicht?” 
Nein: vseitermachen ... 
L-ursorpoasition lceschen 


aktuellen Farkcocode 

ins Coalar-FRAr 

Insertz=aehler erhoehen 

= Akschluss der Zeichenzusqgashe 


Insertzaehler 
= 9? Ja: weiter kei 
Bit 8 setzen 
> Zeichen ausgekern 


59442 


Code fuer "CURSOR LP"? 
Nein: weiter hei 39465 


228 


125 kis 159 (Steuerzeichen??”? 


Srzsorpcosition 


c-Er1 


= EensıIcl zZ - - m m - - 


a $— = We En 


Ausgabe eines Zeichens auf Bildschirm (Fortsetzung) 


59446 
59448 
59459 


9422 


59454 
59455 
59457 


LOS 
BEQO 
DEC 
LDA 
SEC 
SBC 
BCC 
STAA 
BPL 


JSR 
BNE 


CMP 
BNE 
LDA 
STA 
CMP 
BNE 
TrA 
BEOQ 
ISR 


& DEY 


STYr 
IMP 


JISR 
JMP 


CMP 
BHE 


2 JSR 


IMP 


ÜPRR 
ISR 
JMPF 


214 
39505 
214 
211 


#40 
Ss3463 


33137 
=Fa4s 


#19 
39308 


39592 
390483 


#128 
53595 
60495 


Cursorzeile 

= 0? Ia: Zeichenausgake akschliessen, weiter bei 59505 
Cursorzeile vermindern 

Cursorspalte 

um Zeilenlaenge vermindern 


Cursorkewegurga in Doppelzeile? Nein: weiter bei 59463 
sonst neue Cursorspalte speichern 
Inkedingater Sprung zum Rbschluss der Zeichenausgabe 


> Zeilenparameter aktualisieren & 
UInkedingter Sprung zum Abschluss der Zeichenausgabe 


Code fuer "REYERS OFF"? 
Nein: weiter kei S5947& 


Resers-Flayg loeschen 

Code fuer "CURSOR LEFT"? 

Neins weiter hei 59498 

mamentare Spalte = erste Spalte? 

Ja: weiter kei 59492 

> wenn Rueckschritt in Startzeile, Cursorzeile vermindern 
Spaltenzaehler vermindern 

und als neuen Spaltenpointer speichern 


- 


>= Ahschluss der Zeichenausgake 


> Rueckschritt in nicht zur Cursarzeile gehoerige Zeile 


- 


> Abschluss der Zeichenausaakbe 


Code fuer "CLEAR SCREEN" 
Nein: weiter kei 39503 
> Bildschirm loescher 


> Abschluss der Zeichenausgake 


Bit 7” setzen 
> Cantrolcodes fuer Farke pruefen 
> weitere Zeichencades akfraserı 


Neue Zeile initizslisierer 


a A 


bau L ii 


DT un Ba ı Ba En en 


Ba En El u a BE | Ba FR En u u rer) 


Fla4 fuer Cursorzeilerwechsel (v9l. 39911 FF? 
Lursorzeilenpointer 

um eins erhoehen 

letzte Zeile erreicht? 

Nein: weiter kei 9323 

> SCROLL. Bildschirmirhalt nach oben verschieben 
Fortzetzunuszeile” 

Ja: mach eirmzal scrollen 

neue Lursarzeile setzen 

> Zeilenparameter aktualisieren 


loeschen “Carrisge Return) 


Insert-Zaehler lcescher 
Revenr=-Fla4. 

Yucte-Paocdus ruecksetzen 

Cursor in erste Spalte =setzen 
= rege Zeile initislisieren 

> Rkszschluss der Zeichenzussabe 


229 


COEr 


+ BerHzSlıIc vw - - - - - - 


Pruefung. 


III 
ka he ber farben) 
39557 
39559 
395651 
293652 
59564 
539565 
39387 
39368 
39570 


LOX 
LDA 
CMP 
BEO 
CLC 
RDC 
DEX 
BNE 
RTS 


DEC 
RTS 


Pruefung,. 


59579 
S9ISO 
39582 
39333 
39585 


59586 
59588 
59599 
59592 
59594 


LD« 
LDA 
CMP 
BEQ 
CLC 
ADC 
DE* 
BNE 
RTS 


LD® 
CPX 
BEQ 
INC 
RTS 


#2 
#0 
211 
23353 


IR 


#40 


#2 
#39 


ck Rueckschritt von zweiter in erste Zeile einer Dcoppelzeile 


maximale Anzahl zusammeruehcorisger Zeilen 


Lursorspaälte = (Rcocu)? 
Ja: weiter hei 59568 


zeilenlaenge addierer 


Cursorzeilenpointer vermindern 


ok Cursor in letzter Spalte beim Bewesen des Cursars nach rechts) 


maximale Anzahl zusammenhaengender Zeilen 
Laense einer Einfachzeile 

Cursorspalte mit Accu vergleichen 

Gleich: weiter kei 59586 


zeilenlaenge addieren 

und ncach ein zweites Mal pruefen 
Cursorzeilernpaointer 

= 253? 


Ja: RTS 
sonst Cursorzeilenpointer erhoehen 


Controlcodes fuer Farke pruefen 


39595 
59597 
396g 
S9602 
39603 
39605 


9806 
5392609 


S9&10 
29618 


LDX #15 Anzahl mceqlicher Farken — 1 

CHPUOCSSE1A,8 Steverzeichen mit Wert in Tabelle vergleichen 

BEQ T9646 Gleich: Farke setzen. weiter hei S9IHBE 

DEX* 

BFL 59597 

RTS 

ST* ads Farbe setzen “in Adresse fuer aktuellen Farkeode> 
RTS 

144 5 28 15393 155 > 31 159 zugehceriae Tabelle der Farkcodes 
1293 1493 158 151 152 153 154 155 


SCRÜOLL. Bildschirminrhalt nach oben verschieken 


5982E 
596528 
59629 
5968231 
59632 
S9E34 
596353 
59837 
59838 
59640 
sa9s42 
59644 
59647 


LDA 
PHR 
LDA 
PHR 
LDA 
PHR 
LODR: 
PHR 
LD= 
DEC 
DEC 
DEC 
INS 


1r2 


12-17 uf Stack retten 


KR als Zeilenzaehler initialisjeren 
Lursarzeilenpcinter vermindern 
Curscorzeilenpcinter (Rufruf van CHRIN. wal. 
and Nummer der Fartsetzungszeile um eins vermindern 


230 


>>35TI2 


ERIAT Ft) 


er &I+ PBRS>SIC Vz z = = = = zu bee Bein 
SCRÜLL, Bildschirminhalt nach «ben verschieken “Fartszsetzung> 

59848 ISR 5398388 > Pceinter zuf Zeilenanfzng setzen 

59651 CPX #24 szemtliche Zeiler »erschaben” 

596833 BCS 539667 Ja: weiter kei 9667 

59655 LDA 2 684557,8 Tabelle der LS5SE= der Zeilenanfaerge des Bildschirms 
598583 STA 172 als Pointer low setzen 

59654 LDA 213,#% Takelle fuer MSBs und Doppelzeilenkennzeichnung 
59662 ISR 5983483 > Paeinter setzen. Zeile in varherise Zeile kopieren 
59665 BMI 39647 Unkedinater Sprung 

S9667 JSR 59903 > letzte Bildschirmzeile loeschenr 

596870 LDX #40 MSB= und Doppelzeilenkennzeichrnung verschieben 
59672 LOA 217.8 

59674 AND #127 

59676 LDY 218,® 

593673 BPL 396532 

5968A ORA #128 

598682 STA 217,xX 

59884 INX 

59685 CPX #24 

59687 BNE 359672 

59689 LDA 241 reue Zeile 2m unteren Ende 

59691 ORA #128 als Einfachzeile kennzeichnen 

59693 STA 241 

5968595 LDA e1Yy Ist ckerste Zeile eine Fortsetzungszeile”? 
59697 BPL 59838 Ja: noch einm=l scrallen 

596899 INC 214 Cursaorzeilenrrointer erhoehen 

59781 INC &77 Nummer der Fortsetzungzeile um einz erhoehen 
59704 LDA #127 

Ss970& STA 56320 Row-Select fuer Tast=aturakfrage 

59709 LDA 56321 Columm-Select fuer Tastaturakbfr aue 

s9712 CMF 4251 Lantrol-Taste sedrueckt” 

59714 PHP 

59715 LDA #127 

59717 sta 56320 

s97’20 PLP 

s9721 BNE 59734 Nein: weiter hei 393734 

59723 LDY +0 Yerzoeserunasschleife 

59725 NOP 

59726 DEX 

59727 BNE 59723 

59729 DEY 

59730 BNE 359725 

59732 ST'Y 193 Tastaturpuffer lcoeschern 

59734 LDA 214 Cursorzeilenpcinter ins #R 

39736 PLA 1lVYZ2,r.2....179> wiederherstellen 

59737 STRA 175 

59739 PLA 

59740 STA 174 

59742 PLA 

59743 STA 173 

59745 PLA 

59746 STA 172 

59748 RTS 


231 


CE 2:4 EHRSICc zZ - - - - = - =>2749 


Fortsetzungszeile anfuegen 


23749 LDX zid4 CLursorzeilenpcinter 
59751 INS 


S9aVY SZ LOA elvr.® sehcert Zeile unter Cursaorzeile bereits zur Cursorzeile 
S9754 BPL 59751 Ja: nzaechste nichtzugehcerige Zeile suchen 

397585 ST* 877 Hummer der zanzufuesernden Zeile 

53753 CPX #24 kleiner ader aleich 24 “alsca nach im Bildschirm)? 
59761 BEQ 39777 

aar7623 BCC 59777 Ja: weiter kei 39777 

S97683 IJISR 596826 > SCROLL, Bildschirminh=lt nach oben »verschiehen 
297858 LDXS ya Nummer der znzufuesenden Zeil®e 

59771 DES um eins vermindern 

Ssorr72 DEC 214 _ ebenzca Curscarzeilenpcinter 

sar’r74 IMP 594093 > Fortsetzungszeile initialisieren 

23777 LOR 172 1lYZreası 179) auf Stack retten 

39773 PHA 

9780 LOR 1723 

9782 PHRA 

39733 LOA 174 

297853 PHA 

9735 LDA 175 

Har38 PHA 

937393 LDES #25 “AR als Zeilenzaehler initialisrieren 

s9731 DE#X 

sa79z2 ISR 539839383 > Zeilenpointer (209.214) setzen 

53795 CP% ya kereits alle Zeilen bis Lursaorzeile verschaken? 
Ss3798 BCC 2 59814 

g9gaa BEQ 59814 Ja: weiter bei 399314 

Soga2 LDOR 2 569599.% Tabelle der LSB= der Zeilenanfzenge 

92305 5TA 172 alz Pointer law setzen 

9347 LOA 218.8 Takelle der MSBe und Doppelzeilenkennzeichnung 
„32093 ISR 539948 = Zeileninhalt um eine Zeile nach unten kopieren 
SaS12 BMI 59731 Inkedinater Sprurs 


299514 ISR 059943 > eirsefueate Zeile loeschen 

9817 LO8 #223 Tabelle der MNSEs verschieken 

s33313 CP Br y kereitz alles Vverschaoken? 

S33zz BCE 725398393 Ja: weiter hei 73539 

SaS24 LDR eiS,.H Tzbelle der MSBs und Doppelzeilenkennzeichrus 
SaszE AND #127 nach "unten” verschieken 

293522 1DYV 217.8 

9330 BPL 59334 

S3S32 ORRA #128 

93234 STA 213.8 

9338 DES 

9237 EHE 59819 weiter kei 533193 

9333 LE# Sr Nummer der einsefueaten Zeile 

2a9ade ITSR 70599 > Zeile als [lorpelzeile markieren und initislisieren 
39347 TMP  5373€E >= £« 1lVY2,....172> wjederherstellen 


232 


CP S5SI4 BHZSIC WwZ - - - - - - 52342 


Zeile in andere Zeile kopieren “fuer SCROLL und ”Zeile einfuegen”) 


59848 AND #3 Adresse hiah der Zeile 

s93358 ORA 848 "berechnen” 

s9853 STR 173 und als Pcinter hiah speichern 

59855 JSR 59872 > Transferpointer in Color-RAM berechnen 
53858 LDY #39 


s9858 LDA <1723,Y Zeileninhalt Zeichen fuer Zeichen 
59862 STRA 209) ,Y in neue Zeile verschieken 

s9364 LDA 1745, ekensoa die Farkcodes 

59866 STA 24375 ,Y 

s93&8 DEY alle dü Zeichen verschaken? 

593659 BPL 5236508 Nein: weitermachen ... 

593871 RTS 


Pointer in Colcr-RAM kerechner 


s9372 JSR 59940 > Pointer in Color-RAM berechnen 

s98575 LDA 172 Trarnsferpceinter fuer Quellzeile in Colorpointer 

59877 STR 174 fuer Quellbereich umwandeln 

s9879 LDA 173 

59881 AND #3 Bitz a und 1 isolieren 

s9883 ORR #216 21S * 256 = 55296, Startadresse des Color-Nybble-RAMs 
59935 STA 175 

59337 RTS 


Pointer in <2a9’210> auf Zeile “Nummer im KR) setzen 


S99338 LDA 2 60856,% Tabelle der LSBs der Zeilenanfaenge 


53891 STA 249 Pceinter law 

59893 LDA 217,8 Tabelle der MSBs=s und Doppelzeilenkennzeichnung 
59895 AND #3 Bits a und 1 isolieren 

59897 DORA 848 Startpasition hiah des Bildschirm-RAMs 

sa9aA STA 21a eraikt Pointer hiah 

593892 RTS 


Zeile loeschen 


ss9a3 LO'Y #39 Lsenge der Zeile — 1 

593905 ISR 59338 = Zeilenpcinter 209.210) setzen 

s9908 ISR 9940 > Pointer in Color-RAM kerechnen 

sa9311 LORA #32 Lsercade 

59913 STAA .2a9) ,Y in Bildschirm-RAM kbrinsenr 

59313 JISR 05898598 > Background-Coler in Color—-RAM kringen 
59918 NOP 

s9919 DEY alle JG Zeichen gelnescht” 

sag92a BPL 59911 Nein: weitermachen „... 

s9922 RTS 


eeichen “Accuy> und Farkcocode Kim FR? auf Cursarposition speichern 


3923 TAT Accu merken 

3924 LOA #2 

eI992E STA Pd 5 be! Zaehler fuer Elinkdauer des Cursars fuer REPERT> 
53923 ISE 79944 > Pointer in Colaor-RAM kerechnen 

s93331 TYA 

9332 LET il Feinter zuf Lursorspalte 

53324 STA Da 5: Br BR u Zeichen speicherrn 

739358 TARA 

aAaF:r STA Du Sr 2 BEL ı Farkwert speichern 

3333 FRT=S 


233 


Br &7+ ERrR=SIc „zZ - - - - - - => 94m 


Pointer in Ceolar-RAM aus Pointer in Bildschirm-RAM berechnen 


9340 LDA 2a9 Position des Lursors im Bildschirm-FRAn 
53942 STA 243 in Position des Cursors im Colar-Nvkkle—-RRAM 
9944 LOA 210 umwandeln 

5939468 AND #3 

53943 QRA #216 

593954 STA 244 


39932 RTS 


IRQ-Rautine, wird im Narmalfall alle sdistel Sekunden aufgerufen 


59953 JSR 65514 > UDTIM. Uhrzeit um eine 68608stel Sekunde weitersetzen 
5993565 LDRA 204 Cursar eingeschaltet”? 

59958 BNE sa001 Nein: Cursaor-Behandlung ueberspringen 
S99680 DEC 205 Zaehler fuer Blinkdsuer des Cursors vermindern 
59962 EBENE 80081 Zeit „orbei? Neins weiter sa001 

59964 LDA #20 

59965 STA a5 Zaehler wieder meu initialisieren 

59963 LDY z1l Lursorspalte in 'R 

s99r7a LSR 207 Fl29 fuer Cursor \hell’dunkel> 

S9972 LOX 547 Farkcode unter Cursor 

59975 LDA 2095 ,'Yr Zeichen unter Curscar „cam Bildschirm lesen 
59377 BCS 59996 war Curscar dunkel? Nein: weiter hei 39996 
5399793 INC ea” Flag fuer "Cursor hell’ setzen 

59981 STAA 2086 Zeichen unter Cursor merken 

5939333 ISR 539948 > Pceinter in Color-RAN berechnen 

S9936 LDA 2437. Farbcode unter Curscor 

59938 STA 47 merken 

59991 LOX SE nomentanen Farkcode (Cursar- und PRINT-Farke) ins #R 
59994 LDA 2085 Zeichen unter Cursor 

39998 EOR 4128 imvertieren 

59998 ISR 599332 und zusammen mit Farbkwert zuf Bildschirm kringenr 
8RBBB1 LDOA 1 

geaaa3 AND #16 Reccrdertaste sedrueckt” 

s0805 BEQ $U017 Ja: weiter kei 54917 

sauna? LDY 40 

saaa? ST'r 132 Flag fuer Matarkontralle lceschen 

saa11 LDOR 1 

saa1l?3 ORA #32 Matcr ausschalten 

80015 BNE 5099253 Unkedingter Sprung 

saalr7 LDA 192 Flay fuer Natorkantralle aesetzt? 

sG0819 BNE sadzr Nein: weiter hei 84027 

saaziı LDA 1 

80023 AND #31 Motor einschalten 

89825 STA i 

saa27 ISR 80039 > SCHEEYT, Tastaturakfr24e 

saaza LDA 56333 

saa>33 PLA Reyi=zter wiederherstellen 

saa3g4 TAY 

g80a35 PLA 

saa36&s TAX 

0337 PLA 

5038 RTI 


234 


CBr &+ BRSIC zZ - - - - - - nt u 5 Br u 


SCHKEY, Tastatur akfr age 

80R39 LOA Ha Flag fuer Shift “Bit ©), CBNM-Taste (Bit 1) 

88Q41 STA 553 und Control “Bit 2> loeschen 

89044 LDY #64 j 

89Qa46 STY 03 Tastaturcode mit 64 Ckeine Taste gedrueckt)> vorkelesen 
68048 STA 586328 Null nach 59320 \fra4t alle Tasten ak) 

saa51l LDX 56321 Coalumm-Select 

60054 CPx #255 = 255 (keine der Tasten sedrueckt>” 

g8a0SE6 BEU 64155 Ja: weiter kei 540138 

89058 TAY YR := 

60059 LDA #129 2g457 2465 ı= 50289 

6BR51l STR 245 (sStartadresse der Tastaturdecadierungstzkelle> 
gsaas3 LDA 4235 

60965 STA 246 

saa67 LDORA #234 erste 5palte akfragen (Bit A geloescht> 

8sua69 STA 36320 nach Row-Select krinaenr 

gsaa72 LDX #83 Zaehler fuer 38 Spalten 

68074 PHR <Mert fuer Raw-Select) merken 

89075 LOAR 586321 Dekaoder -Rusuang 

80073 CMP 58321 nochmalige Abfr=zse zum Enterellen 

saag1 BNE 80075 

EAaS3 LSR Bit herausshitten 

80084 BCS 8EA1LAZ gesetzt (Taste nicht sedrueckt)? Ta: weiter hei Sulds 
saa86 FPHR Wert merken 

69087 LDR 2453) .Y Wert aus Takelle halen 

80983 CHMP 49 groesser als 4 keine Kantroalltaste) 

68091 BCS 601095 Ja: weiter bei 64105 | 

saua93 CMP #3 oder wleich 3 “RUNSTOF-Taste)” 

6880895 BEQ 580105 Ja: weiter kei 80145 

sau9? ORA 853 entsprechendes Fl=a fuer Shift, CBM-Taste 

sa1LAB STA En oder Control setzen 

sa1la3 BPL 680107 Unkedingater Sprund 

sa1la5 STTr 203 Wert als Tastaturmatriscade speichern 

88187 PLA Wert zus Dekoder-Ausazng wiederherstellen 

sales INY 

893109 CPY 4655 alle 84 T=a=sten akaefr=a4r?7 

8a1 il BCS 6124 Ja: weiter kei sal24 

sa1 13 DEX Zaehler fuer Raw-Select vermindern 

68114 BNE s$aA23 

8B116 SEC. Carrv setzen (fuer RüL)> 

898117 PLA Wert fuer Rau-Select wiederherstellen 

sal 18 ROLL und selseschtes Bit weiter nach links verschieben 
88119 STAR 56320 fuer Columm-Select neu speichern 

6B122 BNE 50972 Unkedingter Sprung 

68124 PLA Stack naormalisieren 

68125 JMP 635) Normalwert des Yektorzs (8599/85565 Baer 

69128 LDYV 203 Taststurmatr ixcode 

sa1l39 LDA 2453) ,Y Mert zus Dekadierunastakbelle lesen 

68132 TAX im XR merken 

68133 CPY 197 mit Wert aus vorherigem Aufruf warı SCHEET veraleichen 
68135 BEQ 608144 identisch? Ja: weiter kei 8a1d44 

68137 LDY #16 neue Taste; 

68139 STY 652 REPERT-Zaehler neu initialisieren 

68142 BNE 68198 Unkedinater Sprung 

69144 RAND #127 Bit 7 loeschen 

68146 BIT 659 Flag fuer REPERT 

68149 BMI 8609173 Bit 7 gesetzt (Repest 11er Tasten)? Ja: weiter kei 84172 
62151 BVS 609226 Bit 5 gesetzt “kein Rereat)? Ja; weiter kei Size 


235 


- En 


SCHKE', 


541323 
s4155 
50157 
59159 
salsiı 
sa1l5? 
81655 
salsr 
sa159 
saiYvi 
sa1l?3 
solre 
sa1r78 
salsi 
sa183 
sa1SE& 
SALZ 
sa1laa 
80193 
84135 
ea196 
501938 
go2aA 
ea2B2 
sa205 
50203 
sazıa 
sa212 
ec213 
50215 
saz2183 
so2za 
sazz23 
e.a22g 
Baz2zE 
saz28 


50231 


CHP 
BEQO 
CMP 
BEO 


CMP. 


BEO 
CMP 
BEN 
cHP 
ENE 
LD'Y 


BEQ 


DEC 
BNE 
DEC 
BNE 
LDY 
STYr 
LDY 
DE'Y 
BPL 
LD'Y 
STr 
LO 
ST'r 
CP% 
BEQO 
TEA 
LO 
CP 
BCS 
STA 
IN* 
ST- 
LODA 
STA 
RTS 


#127 
80193 
#420 
5a173 
#32 
sa1 73 
#23 
LT c p Erg 
#17 
sa225 
532 
sa133 


wann dm 
nNALWDASD CT 


Tastaturabfrase (Fortsetzung) 


Zeichen? 

weiter kei 69198 

Lade fuer "DELETE"?- 

Ja: weiter hei 64173 

Code fuer "SPRCE"” 

Ja: weiter kei 84173 

Cade Fuer "CURSOR RIGHT"? 

Ja: weiter kei 684173 

Code fuer "CURSCOR DOUN"T 

Nein: weiter kei 84226 

zZaehler fuer Anspruchszeit fuer REPERT abgelaufen? 

Ja: weiter kei 69133 

Zaehler weiter herakzaehlen 

= @? Nein: weiter kei 59226 

Zaehler fuer WMiederhcalungasgeschwindiakeit herakzaehlen 
= Gd? Nein: weiter kei Saz2E 

Zaehler fuer 
Tasterwiederholungsseschwindiukeit neu 
Anzahl Zeichen im Tastaturputffer 


kein 


initisalisieren 


unaleich Null? Jar weiter kei Sa226& 
Tsstaturmatrixcodes umspeichern 


ebensa die Flays fuer Shift. CBM-Taste und Control 
2337 


Zeichen zus Dekoadierunuvstakelle = 
Ja: kein Zeichen. weiter kei BuZ26& 


in Tastaturpuffer 

mit maximaler Anzahl Zeichen vergleichen 

Groesser cader aleich? Jas nicht akspeichern 

sonst Zeichen am Ende des Tastaturpuffers anfueger 


Anzahl Zeichen 


Anzahl Zeichen um eins erhceher; 
NHormalwert 
in Raw-Select einschreiken 


Umschaltung von Graphik und Mleinschrift ueker Commadare-Taste 


Nu Lid Wi 


JENE UNUD 


Thy hohen nnd ha 
YES HH AH HM 


x) 
Pe fa RD a ran DIDI II DD SO MD DO BI I DJ DS DI 


au) ae u ca Ba Da Sa DE SD DE | 
Dh ide Zain» m 


LOA 
CcHP 
BNE 
CHF 
BED 
LDA 
EMI 
LOA 
EOR 
STA 
IMP 
ASL 
EpP 
BCC 
LOA 
TAH 
LEOA 
STA 
L.0A 
STA 
IMP 


ıı 


# if 


ONMMONT LEDIG 


4) 
De) 


Jı 

pe] 
— fü fi fü Po 
ML EM 
DT Pin m 


„, 
‚r er 


Fl=a3 fuer Shift, Commodcare-Taste und Control 

Shift und Conmmacdconre-Taste gedrueckt? 

Nein: weiter hei 5.0264 

uaren Keide Tasten schen beim letzen Rufruf sedrueckt? 
Ja: Abschluss SCHEET, weiter kei 692268 

Umschaltung klockiert (val. Ssa51a- fr)? 

Ja: weiter kei 60128 


In=chaltunga fuer Graphik und Kleinschrift 

> weiter kei SAl28 

var die Control-Taste yedrueckt? 

Hein: weiter kei 60257 

Offset fuer T=z=staturdecadierunaspeinter 690536 
auf Decodierunastsbelle setzen 


Pointer 243.246) 


>» Fortsetzung der Taststurakfr age 


236 


Sa 1523 


CB ©&©+ PBHSIc 


Pcirter zuf Tasstaturdecodierungstabellen 


sa2s1 161 
80233 194 
80235 2 
sazesr7 124 
Tabellen 

802533 2a 
801239 65 
sa3a9 67 
ea319 85 
sa3293 43 
84339 59 
80349 32 
8a354 1483 
sa3s4 193 
sa3rd4 195 
89384 2173 
sa394 219 
sadad 93 
sa41g4 160 
ea4193 148 
esa429 176 
saA4393 188 
sad49 154 
80459 186 
ea4s9 93 
sa4rY9 1jsu 


235 50289 Takelle fuer einzelne Tasten 
235 80354 Takelle fuer Tasten zusammen mit Shift 
RIcTS 80419 Takelle fuer Tasten zusammen mit Commadore-Taste 
236 EOIIE Takelle fuer Tasten zussmmen mit Control 
fuer Tast=turdeccodierung: 
13 29 136 133 134 135 17 51 87 einzelne Tasten 
a2 9a 33 659 1 53 82 68 54 
ra 34 85 55 59 71 TS 55 72 
Se 57 73 va 48 VYY’ 75 79 78 
sa Te 45 46 58 6864 dd 92 42 
19 1 8ı 9 47 49 55 4 50 
2 81 3 259 
141 157 140 137 138 139 145 35 215 zusammen mit Shift 
238 218 211 137 ı1 37 21a 196 38 
198 zı2 216 393 217 199 4a 194 za 
214 41 221 202 483 205 203 207 206 
zas 204 221 862 931 186 8a 169 192 
147 1 81 222 683 33 55 4 35 
8 209 131 255 
141 197 140 137 1393 139 2093 15a 177 zusammen mit Commocdore-Taste 
151 173 174 177 ı 152 1759 172 153 
187 163 189 154 153 165 155 151 184 
155 41 182 181 48 1857 151 185 17a 
175 1982 zza 82 931 184 5a 163 223 
147 1 81 222 63 1293 95 4 149 
z 171 131 255 
weitere Zeichencodes akfragen “siehe 59345 und 53395135 


sa4agt 
sad4sE 
sa4ss 
sad4g1 
804933 


509435 


5a497 
sa429 


CHIP 
BNE 
LOR 
ORR 
EHE 


CMP 
BNE 
LOA 
ANGE: 
STA 


” JMP 


CMP 
EHE 
LOA 
ar 
EMI 


cHP 
BHE 
DA 
RHO 
STA 
IMF 


* 


Dee Bee ze vr) 


{n 
Ian ch cr) 


I sn nu 
I. 


Code fuer "Grass- und Kleinschrift”? 
Nein: weiter kei 60495 


Eit 1 setzen 
Unkediruter Sprung 


Code fuer "Grossschritft und Graphik”? 
Heins weiter kei saS1a 


Bit 1 lceschen 
> Ausaake akschliessen 


Code Fuer "Blockierung der Shift- und Commadore-Taste”? 


Nein: weiter kei SuaIzl 
Bit ” 

in SI setzen 
Inkedinater Sprung 


ode fuer "Freiqake Jer Shitft- und Commodcere-Taste””? 


Nein: keine weiteren Codes mehr, Rusygake abschliessen 
Eit 7 
in 657 l\ceschenr 


>= Ausashe akschliessenr 


237 


Er S4 BHSIc WvVZ - - 


Tskelle fuer Ta=staturdekodieruna 


sas3E 259 259 259 2959 255 259 255 2597028 23 
80545 1 159 26 193 5 255 1565 18 4 34 
[=1% beta] = 3 8 20 24 31 25 ”’ 153 2 & 
sazsseE 21 22 183 3 1a ids 13 11 15 14 
gsasr7s 255 16 12 255 255 27 a 255 28 255 
s0a536 29 255 255 31 3a 255 144 E& 259 = 
saS96s 255 255 17 255 255 

Daten fuer Yideo-Controsller 

sasa1 a a a A a a a [2] [5 a 
806811 a a a a a a a 155 595 5) 
saesz21 a a S a 2a 1° a [5 a a 
806531 a a 14 5 1 & 3 + a 1 
stsd4i e 3 4 S & Tv 


Text fuer RUNSTOP-Taste 
esgedsE VE 79 85 63 13 S2 85 75 13 
Takelle der LSEs der Bildschirmanfaerge 

sa6IE a 48 Sa 12a 16a zoa 24a 


sass5 144 194 224 
sasrYE 32 


24 64 164 
SS 48 8SS 128 163 203 248 
v2 112 152 192 


Si 


Rautinen zur Bedienung des seriellen Bus 
TALK und LISTEN 


sa681 ORRA #54 Bit © setzen. TALK 


ST SE 


zusammen mit Contral-Taste 


"LORE" CR "RUN" CR 


> Marten. his RS-232-Datenuebertr agung beendet ist 


Accu kann nach Rufruf von 81879 nicht aleich &3 sein 


80633 BIT Bars 

8sR&E34 ORR #32 Bit I zetzen. LISTEN 
80685 JSR 61604 

eas89 PHA Accu merken 

s8a690 BIT 148 Zeichen im Puffer” 
80E92 BPL $ar7ad Nein: weiter kei 8Ara4 
80694 SEC 

80693 ROR 1&3 Flaa fuer EOI setzen 
8606597 TISR 84736 > Buvte ausgeken, EOl 
saraR LSR 148 Flag fuer "Zeichen im Puffer” lceschen 
sa7az LSR 163 Flas fuer EOI loescher 
sarad PLA Accu wiederherstellen 
84705 STA 1493 und in Puffer bringen 
8B7U7 SEI 

E70 JISR 861479 > Serizl Data := law 
epr’ııl CMP #53 

80713 BNE 860718 

8715 ISR $81a6l > Clock Out := lau 
earı1S LDoR 38578 RTN := hiah 

ga721 ORA #3 

sa7z23 STA 56576 

gu7Y2&5 SEI 

&0727 JISR 61070 >= Clock Qut := hish 
80730 JSR 510979 > Seri=l Data := 1Iow 
8a7’33 JSR 61107 > Verzoegerunasschleitfe 


238 


cBPrH S54 PBRS>SIcCcC WW = - - - - - 


Brte auf Bus ausgeben 


89736 SEI 

68737 ISR 61479 
60748 ISR 61097 
80743 BCS 869845 
60743 JISR 61061 
60743 BIT 163 
60738 BPL 609762 
80752 JSR 61997 
807535 BCC 60752 
60757 JSR 814997 
60768 BCS 80757 
69762 JISR 861097 
69765 BCC 60752 
68767 JISR 61078 
60779 LDA #8 
68772 STA 165 
68774 LDA 58576 
60777 CMP 56576 
6078QA BNE 609774 
sa782 ASL 

60783 BCC 59348 
60785 ROR 149 
80787 BCS 60794 
60789 JISR 861088 
68792 BNE 69797 
8a?794 JISR 81079 
60797 JISR 6s1B61 
8BERB NOP 

88891 NOPF 

68892 NOP 

60883 NOP 

6034 LDN 5686576 
688907 RAND 4223 
80309 ORA #16 
sosll STA 56576 
68814 DEC 165 
62816 BNE 509774 
68813 LDA #4 
68328 STAR 56327 
69823 LDA #25 
608235 STA 356335 
690828 LDR 36333 
sa831 LDA 56333 
68834 RND #2 
60836 BNE 69848 
68838 JSR 61997 
608841 BCS 850831 
69843 CLI 

60844 RTS 

Fehlerbkehandlung 
68845 LDA #128 
608847 BIT re 
620848 LDA #3 
60858 JSR 63052 
69853 CLI 

60854 CLC 

688535 BCC 69931 


> Serial Data ı= low 
> Serial Dsta akfragen 


=1? Ja: Bit ” (Des,ice mat present) im Status setzen 
> Clock Qut := low 
Flz4 fuer EOI “wesetzt? 


Nein: weiter bei 860762 

= Datenkit vam Bus halen 

=1? Nein: warten .„.. (warten, 
> Datenkit „om Bus halen 

=9? Nein: warten .„.. “Timeaut fuer EQI erzeugen? 
> Datenkit vom Bus halen 

=1? Nein: warten .„.. “warten. 
> Clock Qut := hiah 


kis Listener bereit) 


kis bereit fuer Daten? 


zZaehler fuer S Bits setzen 


Port A lesen 


Listener bereit” 

Nein: Fehler. weiter kei 684848 

Bit aus Ausasberegister herausshitften 
Ist Bit = 1? Ja: weiter bei 684794 

> Serial Data := hisah 

Inkedingter Sprung 


> Serial Data := 1cow 
> Clock Qut := lcu “datz „alid) 


Serial Data := lcaw 
Clock Qut := hiahı 


Bit-Zaehler vermindern 
alle Bits ausgegeken? Nein: weitermachen ... 


Timer B fuer Wartezeit setzen 


Madus fuer Timer B setzen 


Bit 1 gesetzt (Timecaut Timer BJ? 

Ja: Statuskits fuer Zeitfehler setzen 
> Datenkit vom Bus halen 

=9? Nein: warten ... 


Bit 7 fuer "Device nat present” 


Bits a und 1 fuer Zeitfehler 


> Status setzen 


weiter kei 60931 


239 


kiz Listener Empfang quittiert hat) 


_- Er 


SECOND. Rusaa=ke 


CIOLT 


503933 
sa895 
60337 
Bag9S 
saraa 


saaaz 
saaa3 
s09a& 
sasar 
50909 
sag1d 


UNTRALE. 


50911 
gsa91z 
83315 
509318 
sa92a 
8923 
650925 
50928 
80328 
50931 
50934 
80933 
50937 
5a93S 
gsca94a 
50941 
sa>44 


STA 
JSR 
LOA 
RND 
STA 
RTS 


Sekundsaeradresse nach LISTEH 


Sekundseradresse in Ausgakeresister 
> Sekundaeradresse ausgeben 
HTH := lau «Kaontroal}—-Madus beenden? 


ARusgake Sekundsaeradresse nach TALK 


STA 
JSR 
SEI 
JSR 
ISR 
'ISR 
JSR 
BMI 
CLI 
RTS 


BIT 
BI 
SEC 
ROR 
BNE 


PHR 
JSR 
PLA 
STR 
CLC 
RTS 


SEI 
JSR 
LDRA 
ORR 
STR 
LOR 
BIT 
LDA 
JSR 
ISR 
TARA 
LO“ 
DE* 
BHE 
TAX 
JISR 
JMP 


und 


581097 
BaASSE 


1498 
saIa2 


UNLISTEN 


1a’ 
38376 
#5 
SeEs7E 
#95 


Sekundseradresse in Ausgakereaister 
> Sekundsaeradresse zusaehen 


= Serial Data := high 
> ATNH := lau 

> Clock Qut = 
> Clock In = 07 
Nein: warten ... 


lcou “Kantral1-Modus beenden? 


-r Zeichen zausgeken (Pufferung fuer EOI> 


gepuftfertes Zeichen varhanden? 
Ja: weiter hei 68649242 


Flas fuer "Zeichen im Puffer” setzen 
Unkedinater Sprung 


>= Beute im ARusqsakereaister zuf Bus aussekenr 


Zeichen in Pufter- kringen 


> Clock Qut := hiah 
ATN := hiah 


Kennzeichnung fuer UNTALK 


Kennzeichnung fuer UNLISTEN 
> Ausgake mit ATN = hiah 

= ATN := lou <Kantrol1-Poadus beenden? 
xR merken 
Verzoeserunasschleife um ca. 


“R wiederherstellen 
> Clock Qut := lau 


> Serial Data := Tau 


240 


sa Mikrosekunden 


CC El 


ARCPTR. 


By 


Be ac a Du ST SE u u Ba A ra u 55 


hohen hd 
ID rar ann 
NENENETERERERETEN ET ERERETERERET ER EN 


2 PB ONGDe NDS ADD 


N Er En 


T 
Da) 
re) 
ı 


S Bits 


sıaild 
6116 
61918 
sıa21 
81a24 
81925 
5127 
61929 
61931 
51934 
81937 
6133 
61948 
61942 
51944 
slads 
61949 
s1asi 
61953 
61B5E 
81958 
51A59 
61968 


sıcsl 
51064 
s1ass 
51069 


— 


Zeichen 


SEI 

LOA #G 
STA 1655 
JSRO9O81as1 
JSR 981497 
BPL #54355 
nA #1 
STAR 75327 
LDA #25 
STH 76335 
JSR 81479 
LOR 55333 
LOA 36333 
AHO #2 
EBENE 84994 
JSR 72810997 
EMI 64976 
BPL s1a1id 
LDA 167 
BEQ 59999 
LDA #2 
JMP 80850 
JSR 78610383 
JSR 29 8s1i1asi 
LDA #54 
JSR O9 022 
INC 1655 
BNE 84960 
holen 

LOA #3 
STR 183 
LDA 585376 
CHPU4 56576 
BNE 81@18 
ARSL 

EPLOÄ16&61UG1S 
ROR 1654 
LDA 2 Se57E 
CHPUXIS57E 
BNE s1031 
ASL 

EMI 61031 
DEC 183 
BNE 861618 
’SR 81488 
BIT 144 
BYC 51056 
JSR 6860934 
LDA 184 
cLI 

CLC 

RTS 

LOR 58376 
AND #233 
STA 3585576 
RTS 


.3CHllt 


Bus halen 


16805 ı= @ vENI. falls Timeaut) 
> Clock Out := lau 

> Clack In = 1? 

Neins warten ... 

Martezeit fuer Timer RB setzen 


Macdus Fuer Timer R setzen 


> Serial Data := low (ready For data) 


Bit 1 “«Timeaut Timer BR) sesetzt? 

Ja: weiter hei 80990 

> Clock In = 8 (Start der Buvteuekertraguna?”? 
Nein: warten „.. 

san=t Bvte san Bus halenr 

1695 = 07 

Ja: EQOI empfangen. weiter hei 68499: 
Eit.1 “Timeaut.‘Imput) 

> Status setzen. Fehlerkehandlung 

> Seri=l Data := hiah GEÜUI accepted) 
> Clock Qut s= lau 

Bit & ‘End ar Identifw> 

> Status setzen 


185) = 1 “Zeitfehler. falls Timeaut) 
weiter kei E4980, Daterkuvte nach EOI holen 


Zaehler fuer 8 Bit setzen 
Port A lesen 


Clock In = 1? 

Hein: warten kis Daten queltia 
Daterbit (son Bit 8 kiss Bit 7) in 
Port A lesen 


1645 shiften 


Clock In = A? 


Nein: warten ... 
sille 8 Bits sehcalt? 
Nein: weitermachen 


- 


> Serial Data := hiahı 
EOI aufgetreten? 

Nein: weiter kei &61aS8& 
> Clock Qut := low, Serial Data := 
tehcaltes Datenkuvte in Accu bringen 


inct readv for data) 


"Clock Qut” zuf lau setzen 


241 


_- Er1 


+ FH Il “I - - = - - - 


= 1570 


Routinen zur Behandlung des seriellen Forts (Fortzetzuna?. 


slara 
5173 
51073 
51978 


81079 
slagz 


silaS 
51195 


s11ar7 
51148 
s111lda 
Si11lll 
51113 
Sılld 


LER 
OFRA 
STA 
RTS 


LOA 
RHD 
STA 
RTS 


LOA 
IFA 


STAA 


RTS 


LOA 
CMP 
BHE 
ASL 
RTS 


TARA 
LO“ 
DEX 
BNE 
TA 
RTS 


#184 


s111a 


"lock Out” zuf hiah setzen 


"Serial Data Qut” zuf law setzen 


"Serisal Data Qut” zuf hiah setzen 


Daten vom Port A lesen 
Datenkit in Carrv schieben, Clack In im N-Flas 


Verzoewerungsschleife um ca. eine Millisekunde 


Rautinen zur Bedienung der RS-232 Schnittstelle 


lieber tragung des nsechsten Bits vorkereiten 


51115 
581117 
51113 
s1121 
51123 
51125 
81127 
81123 
51129 
s1131 
51133 
81135 
81137 
51133 
51140 
s1142 


81143 
61145 
51148 
E11 
s112z 
s11nd 
E11T6 
81153 
511359 


LODR 


BEQO 


Bm 
LSPR 
LD« 
BSCC 
DE* 
TARA 
EOR 
STA 
DEC 
BEOQ 
TAR 
AH 
STR 
RTS 


LDA 
BIT 
BEO 
BMI 
BYS 
LOR 
BNE 
DE# 
DIEC 


13a 
81194 
511984 
182 
#0 
g1123 


189 
133 
154 
51143 


#4 
151 


#32 
Sg 
Silva 


Bitzaehler fuer Senden 

= A iByte sollstsendiy uebertr=a9en?” Ja: weiter kei &11939 
muss Stopkit uebertragen werden” Ta: weiter kei 681184 

Bit zus dem Register fuer zu vebertragendes Byte schieben 
Mlert a. falls Datenkit = @ 

Bit gelocescht? Ja: weiter kei 81128 

Wert 255, falls Datenkit = 1 


mit Resister fuer fuer Paritwkit verknueptfen 

und wieder dort zbspeichern 

Bitzaehler vermindern 

= di Valle Daterkits vekertragen?? Ja: weiter bei 611473 


Eit Z isolieren (Datenkit fuer Vekertr 34ung) 
und im Register fuer zu sendendes Bit krirgen 


Maske fuer Bit I Flag fuer Paritv) 

RS-23Z Kommandoregister abfragen \ 

keine Vebertrzgung eines Paritvkits? Iaı weiter kei 61170 
lebertr ang eines bestimmten Bits statt des Paritvbits? 
QNdd Pzaritv”? Nein: weiter kei 81174 

FParitvhkit = 17 

Ja: weiter kei 61159 

Wert 2595 fuer Faritv 

Bitzaehler auf 259 setzen 


242 


CcBr 84 RBRHSIc WzZ - - - - = - =11=1 


Uebertrasung des naechsten Bits varbereiten “Fartsetzung) 


8s1ll6l LDRA 659 RS-232 Kantrollresister 

81164 BPL 61137 zwei Stoppkits?” Nein: RAusaake des Paritvkits vorbereiten 
81166 DEC 1808 Bitzaehler auf 254 setzen 

81168 BNE 5611737 Unkedinater Sprung 

6117Q INC 1808 Bitzaehler erhcoehen, da keine Fzritekit-Rusaskbe 

sll172 BNE 51158 Unbedinater Sprung zur Bestiimmung der Anzahl Stoppkits 
61174 LDRA 189 Paritvkit 

81176 BER 61159 = 90? Ja: Wert a ausgeken 

81178 BNE 61158 ansansten Wert 1 ausseken 

81188 BVS 681159 ltebertraaung des Wertes A, 

s1l182 BVC E81158 Uekertrasurga des Wertes 1 anstatt des Paritvkits 

s1134 INC 180 Bitzaehler erhcaeshen “ist kei Stopepkit-Ausaakhe unter null) 
Ss1186 LDX 4258 Wert fuer Stoppkit 

61188 BNE 81137 Unkedinater Sprung 


lekertragung eines Butes vaorkereiter, 


81198 LDA 850 RS-232 Kommandoreygister 

861193 LSR Handshalze-Macle 

61194 BCC 61203 s-Line? Nein: weiter kei 61203 

81196 BIT 56577 Part B {NMI-CIR> skfragen: lieat "ODSE IN” auf hiah? 
61199 BPL 61230 Nein: ’DSR Sianal Missing”. RS-232 Status setzen 

81201 BVCE 61233 Liegt ’CTS IN” auf Kiah? Nein: ’CTS Signal Missing" 
812093 LDA #0 

61285 STA 189 Register fuer Pruefsumme loescher 

61287 STA 181 Resister fuer zu sendendes Bit laesschen “fuer Startkit) 
61289 LDX 864 Register fuer Martliaenge 

81212 STX 188 in Zasehler fuer Bits uekertragen 

61214 LDY 569 Ist der Zeiger zuf zu uekertrzuendes Rute aleich 

61217 CPY 878 dem Zeiger zuf die naechste freie Stelle im Puffer” 
61228 BER 61241 Ja: alle Zeichen uekertrasen. Vekertr aygung akschlieszsen 
61222 LDRA 243) ,W Zeichen aus Sendepuffer holen 

61224 STA 182 und in Resister fuer zu vekertr=aumendes Bute krimmen 
61226 INC 5669 Zeiger auf zu szsendendes Brte erhüehen 

61229 RTS 

61238 LDRA #64 Bit 8. ’"ODSR Sianal Missing” 

61232 BIT a 

61233 LDA #16 Bit 4, ’CTS Signal Missing” 

61235 ORA 663 mit vorherigem Wert im RS-Z32 Statusreasister verkruertfer 
81238 STA 663 und als neuen Wert wieder dart abspeichern 

61241 LDA #1 Bitwert fuer ”TimerA-NMI sperren” 

81243 STAR 56589 entsprechenden NMI im ICR sperren ”freiwekenr 

61246 EOR 673 mit RS-232 Register fuer aktive NMIs verkruertfen, 

61249 ORRA #128 Bit 7 setzen 

61231 STA 673 nd als neuen blert wieder akspeicherrn 

61254 STAR 36589 vebkrige aktive NMI=zs freigekenr 

61257 RTS 


243 


ed — I 0 


hd 
u 7 ug © © 
DNMWDMmMM 
NN cd 
OD D CO 


o,+ PeSHzsıIc Vz - - - - - - 


LO“ 
LOA 
BLT 
BEQ 
DE* 
BWC 
Dex 
DE 
RTS 


42 
#32 
5539 

612683 


51272 


=> 1253 


Maskerwert fuer Bit 53 

Testen der Bitkanfiguration im RS-232 Kontrollregister 
Ist Bit 5 gosetzt? Nein: weiter hei 61268 

Zasehler fuer Wartliaense um eins vermindern 

Ist Bit 6 gesetzt? Nein: RTS 

esehler fuer Wortiaenge um zwei vermindern 


enpfangenes Bit verzrkeitenr 


51er: 

51275 
sl2rY 
51279 


sı1281 


512933 


Anh 
a u u 


Wi) ia DI PO DO 


DI 
2NoO&0 


< 
ı 
> 


13 ı Bu H BC Bar Se Se See Se a Bu 53) 


IEARNEREAENERRAENEAENEN) 
en 


Na 
nen 


NIT hi 
eb ei fi fh fub fub fh jeb fub feub feh fh fand jaeb 


Der 
= 


LO“ 
BHE 
DEC 
BEQ 
BMI 
LDOA 
EOR 


”’ STR 


LSR 
ROR 
RTS 


DEC. 
LEIA 
BEO 
LDA 
ASL 
LOA 
RODC 
BNE 
LODA 
STA 
ORA 
STA 
STA 
LOA 
JMP 


LOA 
BHE 
STA 
RT= 


LE 
IH'y 
SPY 
EEN 
=T'r 
DE'Y 
LARA 
LODGE 
CF% 
BEQ 
LSFR 
IN» 
BHE 
STA 


ch 
ee 


JA ohnnIın 
Nm enln ii cd 


I 
> 
N Lo 


70 I 
"IND 


J 


ns2nn 
= 


Fi 
eh 
IM) 


Startkit? 

Ja: weiter kei 61328 r. 
Bitzaehler vermindern 

= AM KBute sollstaendig empfangen’? Ja: weiter kei 61335 
sind “ncach) Stoppkits zu empfangen? Ja: weiter kei 61296 
enpfarıgenes Rit 

mit Resister fuer Paritvkit verknuepfen 

und wieder dart akspeicherr 

empfangeres Bit 

in serielles Empfanasresister schieken 


Bitz=zehler vermindern 
enpfanseres Stoppkbit 

= 4? ITa:r weiter bei 6861403 
RS-232 Kantrollregister 
Bit fuer Arzahl Stopepkits 


Carr“ + 1 + Bitzz=ehler 

alle Stoppkits empfangen? Nein: RTS 

Bitwert fuer "FLAG-NMI (Startkit>, RS-232 IN freigeben” 
ICR setzen 


und RS-232 Resister fuer aktive NMI= setzen 
Flaa fuer Startkit setzen 
Bitwert fuer "TimerB-NMI sperren” 


- 


> ICR und Resister fuer aktive Nils setzen 


Sstartkit 
= AM? Hein: weiter bei 61310 
zonst alles in Crdnmung,. Flaa fuer 5Startkit ruecksetzen 


zrkeituna de= emPrfangenen Rytes 


Zeiger auf Ende des Empfanygspuffers sleich 

dem Zeiger auf Anfang des Empfangspuffers <val. 861463) 
Ja: Vekerlauf des Empfangspuffers. weiter kei 613936 
erhcehten Zeiger auf Ende des Empfangspuffers setzen 
enpfzngene=s Evte 

<Shift-Register wurde von rechts her aefuellt) 

sa aft nach rechts verschieken, 


bis erstes empfangenes Bit an Bitposition 8 steht 


enpfznaenes Rute im Emefangspuffer akspeichern 


244 


c- Er 


> PFEeM>SIc zZ - = - - - - 


S13857232 


YVerzrkeitunga des empfangenen Evtes “Fortsetzung? 


51363 
681365 
51368 
e13ra 
581372 
61374 
51376 
613785 
681384 
61381 
61333 
5613985 
81386 
6851383 
61339 
81391 
861392 
61394 
51397 
s14ma 


Aufruf, falls Stoprkit 


81403 
514095 
s14ar7 


LOIA 
BIT 
BEQ 
BMI 
LDR 
EOR 
BEQ 
BVS 
BIT 
BYWC 
LDA 
BIT 
LDA 
BIT 
LOA 
BIT 
LOA 
ORA 
STA 
JMP 


LODA 
BNE 
BEO 


432 
EA 
&1294 
61293 
167 
171 
81381 
61293 
61293 
#1 

#4 
#128 
#2 
5523 
663 
5131@ 


170 
51392 
51383 


Maske fuer Bit 5 

RS-232 Kommandoregister pruefen 

keine Uekertraqsung des Paritykits? Jas weiter kei 61294 
wird ein bestimmtes Bit statt Paritykit vebertragen? RTS 
empfangenes Paritvkit ö 
mit errechnetem Wert verknuepfen 

Gleich?” Ja: weiter kei 61381 

Even Paritv? Jas alles in Ordnung. RTS 


Odd Parit.? Ja: alles in Ordnung. RTS 
Bit a. ’"P=aritv Error” 


Bit Z, "Receiver Buffer Wverrun” 


Bit 7”, ’Break Detected” 

Bit 1. "Framingag Error” 

mit vorherisem blert des RS-Z32 Statusregisters 
verknuepfen und wieder akspeichern 

> Empfang des neuen Burtes vorbereiten 


- a 
serielles Resister fuer Bvte-Empfang 


uurden schon Bits empfangen? Jas ’Framinga Error” 
ansonsten ”"Break Detected”. weiter kei 61389 


CHKOUT-Handling fuer RS-232 


81449 
sid4ll 
141g 
81415 
61417 
51419 
81422 
81424 
sid2s 
61429 
81431 
81433 
81436 
81438 
81441 
1443 
61446 
81449 
eilig 


CHROLT, 


I ch T ıJı 
Ib beub je fen 


STR 
LDA 
LS 
BCC 
LODA 
BIT 
BPL 
BNE 
LODRA 
AND 
EBENE 
BIT 
BYVS 
LOA 
üorr 
STH 
BIT 
BVS 
BMI 
LOA 
STA 
LLC 
RTS 


JSR 


LO 
IN'r 
CP'Yr 
BEÜ 


lei 


chen 


aktiven RAusaskekanal festsetzen 

RS-232 Konmmandcregister 

Handshake-Mcacde 

“-Line? Nein: weiter kei 61458 

Maske fuer "RTS OUT” 

Part B «NMI-CIR> akfrasens lieat ”7DSR IN” auf hiah? 
Nein: ’DSR Signal Missing”, RS-232 Status setzen 
Liegt "RTS QUT” <Sendeanfrage) auf hiah? Ja: fertig 
Merden momentan Daten empfangen? 


Ja: warten „... 
Lieat ’CT3S IN” zuf lou C<Empf3aenger bereit)? 
Nein: warten ... 


"RTS QUT” zuf hiah setzen “keine Sendeanfrage?> 
Lieyut "CTS IN” auf hiah” 

Ja: fertig 

zurueck nach 81446, solange "ODSR IN” auf hiah lieat 


RS-z32 Status auf "DSR Signal Missing” setzen 


> eutl. RS-23Z Vebkertrauuna in Gang bringen 


in R=-Z32 Senderuffer kringen 


Zeiger zuf naechste freie Stelle im RS-232 Sendepuffer 
schon keleat “Test. ck Zeiger van unten den Veber- 
trragumaszeiger erreicht har Puffer wird "rundherum" 
kenutzt)”? Ja; warten kis Platz im Puffer 


245 


c-Erti 


=+ PeHhsSIc = - - - - - - 


seo2357 


SECOND, Ausgaake Sekundaeradresse nach LISTEN 


509537 
5809539 
sasez 
508553 
saS3&7 
SasrTE 


TKSR, 


DEE ur ENT) 


UNTALE und 


sas1l 
Baal 
84915 
59318 
saaz2d 
sa9z23 
80925 
5a925 
ga323 
849331 
50334 
80935 
saa3T" 
Ea3233 
Eaa4a 
s0941 
sa944 


sta 
ISR 
LDR 
AND 
STR 
RTS 


Sekundsaeradresse in Rusagakeresister 
> Sekundaer adresse ausaesben 
RTH := lau <Kantr-cll1-Madus Kkeenden? 


Rusgake Sekundaeradresse nach TRAILK 


STA 
ISR 
SEI 
JISR 
JSR 
SR 
ISR 
BMI 
CLI 
RTS 


BIT 
BI 
SEC 
FOR 
BNE 


PHH 
JSR 
PLA 
STR 
ELC 
RTS 


SEI 
JSR 
LDR 
OFRA 
STA 
LOR 
BIT 
LOA 
JSR 
ISF 
TA 
LDı 
ul 23 
BHE 
TA» 
ISR 
JMF 


148 
Sa9az 


148 
sa>ar7 


LNLISTEH 


s1ar7ıa 
IS2Y76 


Sekundsaeradresse in Ausy=zkeregister 
> Sekundseradresse aussehen 

> Serial Data := hiah 

ZZ ATN := low 

> Clock Out ı= 
> Clack In = 07 
Nein: warten ... 


lau «Kantroli-Madus beenden? 


r Zeichen ausgeken “Pufferiuna Fuer EOID 


gepruffertes Zeichen »varhanden? 
Ja: meiter hei 60902 


Flaa fuer "Zeichen im Fuffer” setzen - 
Unkedinater Sprung " 


> Beute im Ausasakeresister zuf Bus ausgeben 


Zeichen in Puffer bringen 


> Clock Qut 
ARTN := hish 


= hiah 


Kennzeichnung fuer UNTALKE 


Kennzeichnung fuer UNLISTEN 

> Aussake mit ATHN = hiah 

= ATN := low iKantral1-Moadus keender?> 
SE merken 


Verzoegerunasschleife um ca. 7a Mikrosekunden 


AR wiederhersteiller 
> Clock Dut ı= lau 
> Serial Data := 1ow 


246 


CC EBnr1 


7) 
=E 
a 
er 
vr. 


nn cd 
bb je fe juh fenb jan a fand fen 
INCH LNIR CA EN N in 
a a | 
AV SNNMNWD AL 


Warten. 


51604 
816805 
s1hls 
s161a 
61613 
616153 
s1l6lr 


61619 ! 


slhzz 


ele24 


1627 
sie28 


ct = = Bo u ui un am rn 2 = = 


kis RS-232 Dateruekertrasurng akgeschlasser 


17,74 


zauz R=-222 Empfzngzpuftfer halen 

RS-23E Statuskuvte in Accu kringen 
Zeiger zuf naechstee Zeichen im PRS-Z32 Empfangspuftfer 
4leich dem Zeimer auf Jas=s Ende des Emetangspurffers? 
Ja: keine Zeichen „arhanden, weiter kei 617976 


Eit 3 “Zeichen weltigs> im RS-Z32 Status lceschenr 
und in Register fuer RS5-232 St=tus akspeicherHn 
ceichen aus RS-232 Empfzanaspuftfer lesen 


zeiger zu4f naechzstes Zeichen im Empfangaspurffer erhoehen 


Bit 2 (Empfanaspuffer leer) im RS-232 Status setzen 
und im Reuister Tuer RS-232 Status akspeichern 
Code rulıl aAlz Ersatzwert 


ist 


Rcecu merken 
erden momentan 
Nein: fertisa 
Akwarten,. kis RS-232 Datenuebertr agung akgeschlassern 


Daten ueber den RS-Z3Z2 Kanal uvebertr augen? 


FLAG-NMI dis=klen 


RS-232 Register fuer aktive NMIs auf null setzen 
Recu wiederherstellen 


247 


—FRrtl 

Meldungen 
s18529 13 
siedl 13 
Blenz2 ya 
s1856 13 
Ssisss 79 
slsr’a 50 
S18S8 38 
815395 73 
elvraz 13 
siria 172 
slyY1s 13 
alvz2a 13 
&e1735 123 


Ausaske var 


81739 BIT 157 
sivrd4i BPL 61758 
s1rd43 LOAR 8516293.'YT 
sirdeE PHP 

81747 AND #127 
81749 ISR 65490 
81752 INT 

51753 PLP 

s1lr7ad4 EFL 81743 
e1rTe CLC 

51757 RTS 

GETIN. Zeichen var 
81753 LDA 153 
eivrsa BNE &6177a 
81762 LOR 1383 
slv’es4 BEU 61751 
eilvress SEI 

gslrer ImMP 58304 
slrra CMP #2 
eilvY’Zz BNE 81798 
81774 5STY 151 
E1lrr’s JSR 861574 
81772 LDY 151 
817851 CLC 


CHRIN, 


oA 
BNE 
LOR 
STR 
LOA 
STA 
JMP 


Aha 
Ib bb fe fe fuhr fe [ee 
SIASINN NN 
Did own wi 
Ned Nm 


Mn 
pers 
J 
ıD 
& 


CMP 
BNE 
STA 
LOA 
STA 
JMP 


zum 


ma, ac Bas a Be 1 ET En BEE ES a er 


IC u Su FU 5 Dur 6 u 2 CE SU = BT a Be YA 
Jhd Joa una > 


A BEN OENB A BEN Eu N TEE NE RE REES 


1a Bu» su) Ba Ss DEE PURE SEE Fe ER Ba) 


DO eh 


en 


[er \ 
L 
peut 


I1’ü-Hzndlina 


32 89 82 SZ 79 32 32 163 1.0 ERROR # 
Ss2 87° T2 73 v5 7ı 168 SERFCHING 
FÜR 
83 53 232 Sa TE 605397 32 PRESS PLAY 
SI 500 197 ON TAPE 
33 32 82 89 87’ 79 832 83 22 FRESS RECORD 
It EE = 3 Br Fr 4% PLAY 
Em 50 197 OH TRAPE 
SS 73 78 199 LEORDING 
3 73 71 150 SAWING 
v3 va 89 73 7S 199 VERIFYING 
‚8 62 169 FOUND 
Ok. 


I1’Q-Me1ldungen 


153 
&1798 
211 
202 


214 


ea 
s93a 


in 


Rusaske unterdruecken «“Direktmadus)>” 
Ruecksprung. RTS 
Meldung im Bereich warn 


nan 816829 Kiss 81737 ausgehen 


JIas 


> CHROLUT. Rus=ssaake zauf aktiven Rusaakbe-kKanal 


Bit 7 
Nein: 


im Zeichen gesetzt? 
weiter aussehen 


aktiven Eingake-Kanal in Accu 


aktiver Eingsabe-kKansl 
= Tastatur >? Nein: 
Anzahl Zeichen 
=9? Ia: RTS 
Interrupt „verhindern 

Tastaturpuffer um ein Zeichen akkauen 


weiter kei &1Yr7A 
im Tastaturpuffer 


aktiver Eingaabe-kKanal = 2 £R5S-232 Kanal?” 


Neins. weiter bei 61738 
YR merken 
Zeichen aus RS-232 Empfanaspuffer holen 


YR wiederherstellen 


Zeichen vom aktiven Eingabe-Kanal in Accu 


Eingske won Tastatur”? 

Nein: weiter kei 61738 

Lurscorzspaltenpcinter bei Aufru# 

nach «2025 und 

Cursorzeilenpcinter bei Aufruf 

nach “2@1> speichern 

> Eingashbeschleife zur Zeichenuekernahme vom Bildschirm 
aktiver Eingazakbe-Kanzl = 3 (Bildschirm>? 
Nein: weiter bei &1S1l 

Flz4 fuer "Zeichen direkt vam 
aktuelle Cursorzeilenlaenge 
a1l=s Pointer fuer Ende der Zeile speichern 
> Zeicheruebernahme vom Bildschirm 


Bildschirm lesen” 


248 


CB &+ EBERHRSIC 


=-1=11 


CHRIN, Zeichen „om aktiven Eingabe-kKanal in Accu (Fortzetzuna) 


81811 
61813 
81815 
61817 
51813 
51922 
51824 
81325 
51923 
81838 
681832 
51834 
519837 
681839 
E14 
81842 


51843 
51944 
81945 
Ss124E 
51943 


619349 
61932 
5194 
519357 
51359 
61381 
51263 
513653 
51967 
51963 


513659 


CHROLT, 


51898 
515339 
61901 
51923 
51903 
51906 


BCS 
CMP 
BEO 
ST“ 
JSR 
BCS 
PHRA 
ISR 
BCS 
BHE 
LOA 
JSR 
DEC 
LDS 
PLA 
RTS 


TAx 
PLA 
TARA 
LD% 
RTS 


JSR 
EHE 
JSR 
BCS 
LDA 
STR 
BEO 


LOR 
CLC 
RTS 


LORA 
BEQ 
LDA 
CLC 
RTS 


IMP 


JSR 
BCS 
cHP 
EHE 
LDA 
AND 
BNE 


> BEOQ 


PHR 
LOR 
CMP 
BNE 
PLA 
IMP 


51869 
#2 
51830 
151 
81349 
E1245 


81349 
81943 
81337 
#64 
tut 5 be 
1665 
151 


Eingake-kKanal > 3 Lzerieller Bus)? Tas weiter kei 
sleich Z “RS-Z32 Kanal)?” 

Jar weiter bei & 

»R merken 

>= Zeichen zus Puffer lesen. 
Fehler” ITa: weiter kei 81348 
qelesenesz Zeichen merkeri 

> Zeichen aus Puffer lesen. 
Fehler?” Ia: weiter kei 619343 
Code = 37? Nein: weiter hei 81837 
Bit 8 fuer ’End ar Indentitfw” 

> 170-Status setzen 

Pufferzeiser vermindern 

SR vjederherstellen 

gelezsenesz Zeichen wiederherstellen 


enstl. Block in Fuffer lesen 


e,st1l. Elcack in Puffer lesen 


Zeicherccode im Accu merken 
Stack rormalisieren 
und Jen Zeichencade wieder in den Accu krinser 


“FE wiederherstellen 


- 


= Pufferzeiger erhoehen: Test. ck Puftferende erreicht 
Puffer leer? Nein: weiter hei 68156593 

> Block „can Band in Puffer lesen 

Fehler? Ta: RTS mit gesetzten Carrv 

setzen 


Pufferzeiger zuf erstes Zeichen 


\nbedimater Sprung 


Zeichen zus Puffer lesen 


Carry fuer "kein Fehler” lceschen 


1I"Q-Statusbuvte = 07 
Ja: weiter hei 61377 
Code fuer "RETUFH" 


> ACPTR. Zeichen seriellen Bus haler 


De Tut ic) 


- 


> Zeichen aus RS-232 Emprtfzangsputffer: holen 


Fehler” Ia: FTS mit gesetzten CLCarrv 
Code = 0? 
Nein: Carrv loeschen,. FRTS 


RS-232 Status leser 

Bit I oder Bit & gesetzt? 
Ja: weiter kei 61373 
ansonsten zurueck nach 61330 


Ausgabe auf aktiven Kanal 


Datenkute retten 


aktiver Au=ssake-Kanal 

=3 «Bildschirm?>? 

Nein: weiter kei 61909 
Daterkute wieder halen 

> Rusgake auf Bildschirm 


249 


ud 4 6 | 


CHRÜNT. Ausgabe auf 


81343 BCE 61915 
813911 FLA 
s191Z2 IMP 84593 
81915 LSR 
812165 PLA 
81317 STA 138 
819193 TEA 
51920 FHRA 
s1921 TrA 
81922 FHRA 
81923 BCC 61960 
61925 JSR 83701 
813923 BNE 81944 
519336 ISR 6863338 
81333 BCS 81949 
51935 LOA #2 
51937 LOTY 40 
61939 STA «1783 .Y 
51941 INY 
81942 STTr 1&& 
61944 LOA 153 
81945 STA 179) ,.Y 
51943 CLC 
81949 PLA 
519358 TAT 
81351 PLA 
81952 TAsS 
51953 LDA 158 
51955 BCC 81959 
519357 LDA #0 
81959 RTS 
519850 ISR 81463 e 
81963 JMP 819453 
CHEIN, Vorbereitungen 
81965 JISR 62223 
61969 BEQ 8519374 
512971 IMP 83233 
&1974 ISR 62239 
81977 LDA 186 
81979 BEQ 820043 
81981 CMP #3 
819383 BEQ s2a03 
81985 BCS 82007 
81987 CMP #2 
51939 BNE 51994 
813351 IMP 851517 
81994 LDS 155 
81396 CP“ #96& 
813395 BEGU 862003 
seaaa TMHP 53242 
s20a3 STA 13 


5828003 CLC 
52005 RTS 


+ EHZ 


aktiven Kanal 


Il zz rn - - - - - > 1302 


Fortsetzung: 


M 


Ausyake zuf seriellen Bus?” Nein: weiter kei &131! 
Datenkute wiederherstellen 


> CIOUT. Rusaske de=z Accus zuf seriellen Bus 


Bit A der Aussaske-Kanal-Nummer in die Carrv-Fl3a34 schieben 
Datenbute wiederherstellen 
and zwischenspeichern 


Indexresister zuf Stack retten 


Ausgyake auf Band? Nein: weiter bei 81964 

> Pufferzeiser erhoehen: Test, ok Pufferende erreicht 
Puffer vall? Neine weiter hei 51944 

>= Black warn Puffer auf Band schreiben 

Fehler? Ia:r weiter kei 651949 

Kennzeichnung fuer Datenklock 


an erste Cassettenpufferpaositiaon schreiben 


Cassettenpufferzeiger initialisieren 
Datenkute kei Rufruf von CHROLT 

im Puffer akspeichern 

Carr» fuer "kein Fehler” loeschen 
Indexreqyister wiederherstellen 


. Datenbvte wiederherstellen 


RTS 
"BRERE". Abkruch durch RUNSTOP 


Fehler szufgetreten? Nein: 
Accu s:= r Fehlercode fuer 


Zeichen in RS-232 Sendepuffer schreiken 
Abschluss CHROUT 


Nena 


fuer Datenenmnpfana 


> Fileparsmeter in Takelle suchen 
gefunden?” Ta: weiter kei 61974 
> 1rü-Error #3. "FILE NÜT OPEN" 


> Fileparsameter zak:tuslisieren 
Ger aetenummer 

= 8 (Tastatur)? Isa: 
= 3 “Bildschirm>”? 


weiter kei 82043 


Ja: weiter hei 62007 
Geraetenummer > 3 (serieller Bus)? Isa: weiter kei 62007 


= 2 «RES-232 Kanal>? 

Nein: weiter kei 651994 

> Eingabe van RS-232 Kanal varbereiten ' 

aktuelle Sekundaeradresse 

= ?& “einzige Sekundaeradresse beim Lesen von Tape)” 
Jar weiter hei 62003 

> Tü-Erreor #6, "HOT OUTPUT FILE” 


Gerzetenummer als aktiven Eingake-Kansal speichern 


250 


Ce &©&3+ BHR>SIcl zZ - - - - - - en nu In ie 


CHKIN, Yorkereiturgen fuer Datenemefana Fortsetzung) 


gs2aa7 TAX Gersetenummer inz FH retten 

gszaag ITSR 8606581 > TALK. 

szall LOR 185 aktuelle Sekundaer adresse 

s2013 BPL 62821 kleiner 1287? Ja: weiter kei 82021 

s2n1S ISR 80876 > Kantrollmaoadus heender 

s201S IMP 6e2024 > naechsten Befehl uvebkerspringen 

s2R21 ISR -SasV7i > TESA, Sekundaeradresse auf Bus aussehen . 
s2a24 TSA Geraeterummer zu Bus zusgehben 

s52025 BIT 144 Bit 7 im Irü-Stzatuskbvte gesetzt? 

s2027 BFL AÄA$&20a43 Nein: Akschluss CHEIN 

82023 IMP 53239 > 1TrO-Error #5. "DEVICE NOT FRESENT ERROR" 


CHKOUT. Rusgabevorkereitungaen 


s2za32 ISR 682223 > Filenummer in Takelle zuchen 

52035 BEQ 2040 gefunden” Ta: weiter hei £Zza42 

sza37 IMP 83233 > IQO-Erreor #33. "FILE NOT FOUND" 

sza4a ISR 06822393 > Filerarzmeter aktu=lizieren 

s2za43 LOA 186 Ger zetenummer 

52045 BNE 82050 = & !Ta=ststur)? Nein: weiter hei 8Z24JI8 

BziAd4r IMP 53245 > Trü-Error #7, "NOT OUTPUT FILE" 

82056 CMP #3 Ger aeterummer 

seanz2 BEU 8520659 = 3 -Bildschirm>? Iza: weiter kei 620689 

seasSd4 BCS 52073 qroeszser 3 Wserieller Eus>?” Ja: weiter kei 6824”3 
s2zass CMP #2 = 2 ıRS-232 Kanal)? 

82053 BNE 829683 Nein: weiter kei 582053 

szasa IMP 51409 >= Rusaake auf RS-Z32 Kanal vorbereiten 

824573 LDX 1353 aktuelle Selsundasr adresse 

82055 CPx #96 = 36 Leinziwe Sekundsaeradresse zum Lesen von Tape)? 
s2as7 BEQ 62047 Ja: T/O-Errar #7. "NOT GUTPUT FILE" 

s2za&s9 STA 1 I4 Geraeterummer als aktiven Ausuake-kKanal speichern 


s2arl CLC 
g2ar2 RTS 


gear 3 TAX Ger aetenummer ins AR retten 

s2a74 ISR 6065834 > LISTEN 

82077 LOR 183 sktuelle Selaundaer adresse 

82079 EBEFL 62086 kleiner 1237? Ja: weiter kei 52036 
82081 ISR 808962 > Kontrallmoadus beenden 

s2as4 BNE 62989 Unkbedingter Sprung 

szuaS& I5SR 860857 > SECOND, Sekundaeradresse auf Bus ausgeken 
szas? TARA Ger aeternummer. wiederherstellen 
8209a BIT 144 Bit 7” im I/Q-Statuskyte gesetzt? 
2092 BPL 2 62069 Nein: weiter kei 62063 

82294 IMP 83239 > 1Ieü-Error #5, "DEVICE NOT PRESENT" 


CLOSE, File “Nummer im RARccu) schliessen 


g2a97 ISR 82 
sziaa BEOQ 82 
821082 CLC 
82103 RTS 


228 > Filenummer in Tabelle suchen 
14 gefunden? la: weiter kei 82104 


251 


CB 85:4 EHASIC zZ - - = - - - 1094 


CLOSE. File ©Nummer im Accu) schliessen “Fortsetzung? 


s21G4 ISE 686223: > Fileparsmeter sktusalisieren 

82107 TSA Feinter auf Parsmetereintrag in Filetskelle 

82108 FHRA auf Stack lesen 

s2ziaa LDA 136 Ger aetenummer 

52111 BEQ 62193 = 8 (Tastatur)? Ja: weiter kei 621923 

82113 CMP #3 = 3 “Bildschirm>” 

82115 BEQU 521923 Ja: weiter hei 621933 

s21l1v7 BC5 852190 Gerzetenummer + 3 (serieller Bus)? Ia: weiter hei 62194 
82113 CMP #2 = 2 (ıRS-232 Kanal)? 

s2121 EBENE s2172 Nein: weiter kei S21S2 


2) 


82123 PLA Feointer auf Eintr3s3 in Filetskelle „om Stack halen 


S2l24 ISR 0862194 = File-Eintrag zus Takelle loescher 

82127 ISR 625395 > RS-232 Vekertrzaung beenden 

82130 ITSR 65053 > MEMTOP,. Lesen des Speicherendes 

82133 LOR 2ı4R Hiahkute des Pointerze zuf den RS-2232 Empfanaspuffer 
82135 BED 62138 = 0? Ia: weiter hei 52133 

82137 INY Pointer high auf Ende Arbeitsspeicher um eins erhcaeher 
521398 LDA za Hiahkberte des Faeinters auf den RS-Z32 Sendlepuffer 

Ss2l1da BEQO . 62143 = a? Ja: weiter kei Sz1d43 

s21d4z2 INY Pointer hiah auf Ende Arkeitsspeicher um eins erhoehen 
82143 LDA 4a | 

52145 5TA 248 

s2147 STR sa Hiahkutes der R5-232 Puffer-Pointer zuf Hull setzen 
52149 IMP 62589 > weiter kei 627339 

s21S52 LOA 1853 abtuelle Sekundzer adresse 

S21234 AND #12 Bit @ kis Bis 2 isolieren 

S21S6 BED 862193 Lesen van Cassette? Ia: weiter kei 62133 

52158 ISR 867440 > Peinter auf Czassettenpuffer nach (AR-TR> bringen 
s2lel LDA 4a Markierung fuer "letztes Evte im Datenfile” 

szls3 SEC Flags fuer Auszsasake zuf Recorder 

s2ls4 ITSR 861917 > Zeichen in Cassettenpuffer bringen 

s21&87 JISR 8635383 > letzten Block zuf Band schreiben 

e2170 BCC 68621765 Fehler” Hein: weiter hei 82176 

s2172 FLA Painter zuf Eintraa in Filetakelle vom Stack holen 
82173 LOR #0 Accu := &,. Fehlercade fuer "BREAK", Rkekruch durch RUNSTOP 


52173 RTS 


sz1Yes LEA 185 aktuelle Sekundaer adresse 

82179 CMP #33 = 38 “OPEN mit EOT-Kernnzeichnunga>”? 

82130 EBENE 82193 Hein: weiter hei 82193 

szi32 LODA #5 Kennzeichnung fuer EOT-Blocl 

Bsz1&4 ISR 63338 > ECT-Block auf Band schreiken 

s21S87 JIMP 862193 > weiter hei 62193 

52190 ISR 853042 > CLOSE auf seriellen Bus ausseken 

821933 PLA Pointer zuf Eintr39 in Filetsbelle vom Stsck halen 
821934 TRA=s alz Index in=z AR kringen 

82195 DEC 152 Zaehler fuer Anzahl an offenen Files um eins vermindern 
82197 CP 152 und mit Pcinter auf Eintras in Filetzkelle vergleichen 
52139 BER 2221 Gleich? Ja: fertiy 

gs2201 LOY 152 Pceinter auf letzten Eintrag in Filetakelle 

52203 LDA sal.Y letzten Tabelleneintr 33 in freiwerdende Stelle 

sz208 STA 801 .X% .Eintras der zu loeschenden Datei> uekertragen 

s2209 LOA sil,'Y 

s2212 STA sil,.x 


52215 LDA s21l,Y 
822183 STR 821,8 
s2221 CLC 
82222 RTS 


252 


CO Br1 


+4 PeH>ıiIcl zZ - = - - - - on 


Filenummer in Filetskelle suchen 


52223 
82225 
52227 
82228 
82234 
52231 
82233 
682236 
62238 


LODA 4a 

STR 144 Status l\ceschenr 

TEA gesuchte Filenummer „an SR in Accu bringen 
LDs 152 Zeiger in File-Tahbelle 

DE* kereitszs alle Eintrsaege durchsucht? 

EMI 82254 Ja: RTS 

CMP 8al.x Accu mit Filerummer in Tabelle vergleichen 
BNE s2234 IUIngleich? Ias weitersuchen 

RTS 


Fileparsmeter aktualisieren 


82233 
52242 
52244 
82247 
82249 
52252 
52234 


CLALL . 


82255 
62257 


LDA gal,x Filenummer aus Tskelle 

sTtÄ 184 alz aktuelle Filenunmmer zpeichern 
LDA 811.8 

sta 185 ebenso die Primseradresse 

LDA g21.X8 

sta 185 und die Sekundzeradresse 

RTS 


alle Files loeschen 


LOA 40 
STAR 152 alle Files lceschen 


ECLRCHN, aktive IT/’/O-EKanzele schliessen. Standardkanaele aktivieren 


82239 
52261 
52263 
52265 
822683 
52278 
B2272 
5227 
B2277 
822723 
82281 


OPEN, 


MN NM 


LDS #3 aktiver ARusqakelianzl 

CPX 154 aroesser als 3 Sserieller Bus>”? 

BCS 62268 Nein: weiter hei 822688 

JSR 84926 > UNLISTEN auf Bus ausgeben 

CPX 153 Eingaskekanal wroesser als 37 

BCS 6862275 Neins weiter kei 52275 

JSR 284911 > UNTALK zuf Bus ausseken 

STH 154 aktiver Ausyake-kKanal := 3 (Bildschirm) 
LOA je) 

STR 133 aktiver Eingake-Kzanal := 8 (Tastatur) 
RTS 


logisches File erceffren 


LD* 184 Filenummer 

BNE 82289 = a «nicht erlaukt!)”? Nein: weiter hei 82233 
JIMF 63242 > IrQO-Error #&. "NOT INPUT FILE" 

JSR 62223 > Filenummer in Takelle suchen 

BNE 62297 gefunden?” Nein: weiter kei 62297 

JMP 68632304 > Irü-Error #2. "FILE PEN" 

LOS 152 Anzahl caffene Files 

CPx #1a = 10 (maximale Anzahl>” 

BCE 82306 Nein: weiter kei 823048 

JMP 63227 > Trü-Error #1. "TOoG MANY FILES" 


253 


CcENM SI BRSIC VvZ = m - - Br ö pen I 2 I 4 

OPEN, lIcwisches File eraeffnen (Fortsetzung? 

s22306 INC 152 Anzahl offene Files um eins erhoehen 

&223a3 LDA 1234 Filenummer hinter letzten Takelleneintrag 

82310 STR sal.x in Takelle der Fileparsmeter zschreiken 

822313 LDA 185 

52315 ORA #96 Bit S und & der Sekundaeradresse setzen, 

82317 5STRA 135 alz neue Sekundseradresse speichern 

52319 STR S2z1l.® und in Tabelle bringen 

S232E LOR 185 ebenso die Geraetenummer 

522324 STA s1l.® in die Tabelle bringen 

82327 BER 62419 Geraeterummer = A (Tastatur)? Ja: fertig 

523293 CMP #23 = 3 ‘Bildschirm>? 

52331 BEO 62419 Ja: weiter hei 62419 

82333 BCC 62340 kleiner 3? Ixz: weiter kei 623944 

82335 JI5SR 62421 > OPEN auf seriellen Bus ausaeben 

52335 BCC 852419 Unkedinater Sprung zum Abschluss von OPEN 

sz3da CMP #2 Gersetenrummer = 2 \RS-Z32 Kanal>? 

52242 BNE 62347 Hein: weiter hei 62347 

Bz3d44 TMP 624773 >= QPEN-Handlina fuer R5-232 

s2347 ISR oO 5addf >» Feinter auf Cassettenpuffers nach (KR/TR)> 

B2235a BIS 62355 Ist {&RrtR> kleiner 5127 Nein: weiter kei 523535 

52352 IMP 583251 > Teü-Error #9, "ILLEGAL DEWYICE NUMBER" 

52322 LOR 135 al:tuelle Sekundaer adresse 

BEF3ST AND #12 Bit a kis Bit 3 isolieren 

52359 EBENE 62392 Lesen „an Tape? Nein: weiter hei 582392 

823651 ISR 0653511 = "PRESS FLRYT ON TRAPE" 

22354 BCSOÄOB242a Rkkruch durch RUNSTOP? Tas RTS 

BzREsS ISR 27082895 > Im Direktmadus "SEARCHING" und Filenamen ausgehen 

52353 LOA 133 Lsense des Filensmens = 9? 

S22371 BEQO 8623823 Ja: weiter bei 62383 

582373 JI5SR 8634656 > Dateikopf mit ver langtem Namen suchen 

Bares BCl 862402 Fehler? Nein: weiter hei 52402 

52378 BEQO 229420 Akbruch durch RUNSTOF? Ias RTS 

s2320a IMP 63236 >= I-O-Erraor #4, "FILE HOT FOUND" 

823923 I5SR  6327E > Datenklack in Puffer lesen 

523865 BEU 62420 "End af Tape” oder RIUNSTOP? Ta: RTS 

52333 BCC 862402 Fehler” Nein: weiter bei 52402 

22390 BES O2 62380 I-O-Error #3. "FILE NOT FOUND" 
Die Eranches an den Adressen 8523385 und 582388 scallten 
uchl eigentlich in umgekehrter Reihenfolge ztehen!> 

52392 ISR 83544 > "PRESS RECÜRE % PLAY ON TAFE" 

823933 BCS 2 862420 Abkruch durch RUNSTOP? Jas RTS 

52337 LDA #4 Kennzeichnung fuer Dateikopf einer sequentiellen Datei 

52393 ISR 63338 > Dateikopf in Tapekuffer erzeugen und auf Band schreiken. 

82442 LDA #171 Kennzeichnung fuer "kein Zeichen im Puffer” 

szd4a4 LDOY 185 aktuelle Sekundaeradresse 

s24as CP'Y #96 = 96 “Lesen „on Cassette)’ 

2408 BER 652417 Ja: weiter kei &2417 

sz4la LDY #a Index fuer erste Position des Cassettenpuffers. 

e2412 LOA #2 Kennzeichnung fuer Datenblcack einer sequentiellen Datei 

85244 STA 1’S>,Y in erste Pufferposition bringen 

s2416 TYVA 

e2417 5STA 166 Pufferzeiger festsetzen 

a2ga413 CLC 

52420 RTS 


254 


Ce ©: BRBRrR>S1lc zZ = = - - = RR nel 
OPEN auf seriellen Bus ausgehen 

s2421 LDR 185 sk:tuelle Sekundsaer adresse 

82423 BMI 62419 kleiner 128? Neins fertig 

52425 LO 133 Laenge des Filenamen= 

82427 BEQ 62413 = 9? Ja: tertia 

82429 LDA #0 

52431 STA 1443 .- Status lcoeschen 

852433 LDA 1235 Ger aetenummer- 

82435 JISR 89694 > LISTEN 

82433 LDA 135 aktuelle Sekundszeradresse 
8244 OFR #240 Bit 4 ki=s Bit 7 setzen “Kennzeichnung Fuer OPEN) 
82442 ISR 8609357 > SECOND. Ausaahbe Sekundaeracresse 

E2445 LOR 144 Bit ” im Irü-Statuskute gesetzt? 

62447 BPL A 62454 Nein: weiter kei 52däd4 | 

82449 PLA Ruecksprungadresse scan Stack entfernen 

8245A PLA 

s2451 IMP 63239 > IüO-Errar #5, "DEWYICE NAT FRESEHT" 

82454 LOA 133 Laenge des Filenamens 

52458 BER 62470 = A? Ja: weiter kei S24rıa 

562453 LO'Y #0 Index fuer Filenzmen 

e2d4sa LOA 1STH,Y zeicheh zus Filenamen lesen 

s2462 ISR 564393 > CIMWT, Zeichen auf seriellen Bus zusgeken 
s2455 INT 

B2d4oH CP'Tr 13% alle Zeichen ausgegeken” 

824658 BNE 82484 Nein: weitermachen „... 

gs2d4r7a IMF 4 Saas > UNLISTEN. Carrv loeschen. FRT5 

OPEN fuer RS-Z22-Handlineg 

5247”3 ISR 062595 > zaentliche NMIzs verhindern. RS-232 Il initialisieren 
s2d4r’ö STYV 53 RS-232 .Status laoeschen 

82479 CP'Yr 183 L.s3enye des Fiisenasmens 

82431 BEO 624933 = a? Ja: weiter kei 5274323 

82453 LOA IST) ,.T llekertrasung der ersten 4 Butes des Filenamens 
82435 STA 59, in den Bereich 833,....B82)J 

82498 INY 

s2d4g3 CPY #4 

82421 BNE 62479 

82493 ISR 8512583 > Martliaerse fuer RS-Z232 Dateruekertraaung feststellen 
52496 STX 8654 und in den Speicher fuer die Wartliaenge schreiken 
82499 LODR 639 RS-2Z32 Kontrallregister 

82502 AND #15 Bitz a kiszs 3 iscalieren (Kennzeichnung fuer die Baud-FRate) 
82504 BEQO 62534 = fi (lLiser-Baud-Rate)>” la: weiter kei 5825934 
82508 ASL Index fuer Takelle verdoppeln 

82507 TRA% und als Index ins xR bringen 

s2>sas LOA BY8 Fls94 fuer Quarzfrequenz «“NTSC=@a,. PAL=1> 

82511 BNE 823522 = 1? Ja: weiter hei 67922 

82513 LDY 6869217.8% Timer-Werte fuer die Baud-Rate aus 

s2sile LOR 65216,.% NTSC-Takelle holen 

82519 IMP 62528 > weiter bei 527528 

52522 LOY 38603.8 Timer—-WMerte fuer die Baud-Rate zus 

82525 LDA 593602,% PAL-Takelle holen 

82528 STY 862 und nach (866176652) kringen 

82531 STA 861. 

82534 LORA 861 

62537 ASL Timer-Wert in (661.662? verdoppeln, 

82538 JISR 85326 > 200 addieren und nach 5696656) uekertragen 
82541 LDRA sea RS-232 Kommandoresister 

52544 LSR Handshalke-NMaode 

582545 BCE 825356 8x-Line? Nein: weiter kei 62556 


255 


Cr &4+ BRSIcC W2Z - - ei - - - en 


OPEN fuer RS-232-Handlina “Fortsetzung? 


g2247 LOR 585377 Port E der NMI-CIR 

82550 ASL Ist ’DSR IN” auf hish gesetzt? 

82551 BCS 82556 Ja: weiter kei 62556 

82553 JSR 61453 > "DSR Signal Missing”. RS-232 Status setzen 

825585 LOA 887 Pointer auf Ende des Empfangspuffers 

823533 STA 568 in Pointer zuf Anfang des Empfangspuffers uekertragen 
525652 LDA E70 Pointer auf Ende des Sendepuffers 

8276559 5TA 553 in Pointer auf Anfang des Sendepufferzs uekbertrasen 
52588 ISE 65063 > MEMTOP, Speicherende lesen (sR/YR)> 

82571 LDA 243 Hishhvte des Pcinters zauf den Empfanssputffer 

82573 BNE 625804 = &?7 Nein: weiter hei 682530 

82575 DE'Tr 

525378 STr 248 255 Bvtes fuer den Empefansspuffer reservieren 
82573 STX 2 

52380 LOA 25a Hiyhkurte des Fointersz zuf den Sendepuffer 

B25S2 BNE 62599 = 8? Nein: weiter kei 8525939 

82334 DE’Y 

62535 STr Fa 5 255 Brtes fuer den Sendepuffer reservieren 

82597 ST# 243 

52599 SEC Fehlerflag setzen 

82590 LOA #240 Code fuer "Puffer schuetzen”’freigeben”., 91. 37233 + 
52292 IM 890659 > 


> MEMTOF,. Sreicherende festsetzen (RK “rR) 


RS-232-1.0 imitialisieren"akkrechen 


52395 LOA #127 

S23537 STAA 555989 zsaemtliche NMI= Wausser RESTÜRE> klockieren 
s2saa LDA #6 

BeeaZ STA 3865979 Daten ichtungsregister 

Szsaa STA 56857 und Port fuer RS-232-Handling initislisieren 
52548 LORA #4 

szeld ORA 36576 

52513 STA 2 58978 "RS-232 QUT” zuf hiah setzen 

szeile LOY #0 

52613 STY 8723 RS-Z32-Reygister fuer aktive Interrupts auf null setzen 
82521 RTS 


LORD. Load und VYerifv von Froar ammen 

BEeezE ISTA 133 Ainfangsadresse des Programms 

s28524 STTr 196 falls RAPPEHND “z. B. zn Speicher anfang) 
S26825 IMP 3185 Hormalwert des Yektors .3165.’8177: 826523 
ez8293 STA 147 Flaa fuer LOAD a5 und YERIFY “1> 

52831 LOA #0 

B2E23 STA 144 Status laeschen 

52837 LOR 125 Ger aetenummer 

szeE37” BNE 82642 =a Tastatur)? Nein: weiter bei 82842 
52639 IMP 63251 > ITü-Error #9. "ILLEGAL DEVICE NUMBER" 


ezsdz2 CHF #3 =3 «Bildschirm>? 

826544 BEQO 62639 Ja: IT-ü-Error #3, "ILLEGAL DEYICE NUMBER" 
sze4&6 BCE 852771 kleiner 37 Ja: weiter bei 82771 

8265453 LOY 1323 Laenge des Filenamens 

s2&5540 BNE 82695 = 0? Nein: weiter bei 652653 

S28552 IMP 63243 > LO-Erreor #3. "MISSING FILE NAME" 


256 


CE =©4 FEASIC zZ - - - - - - er te Das 


LOAD, Load und Yerifv von Praarsmmern (Fartsetzung) 


82555 LD8 185 Sekundseradresse ins XR retten 

B2bSr7 ISR 62335 > Rusaake "SERFRCHING ",. estl. "FOR" mit Filenamer 

Bes LOR #965 

E26 2 STA 195 Sekundzeradresse zuf 95 (LORD vom seriellen Eus> setzen 


827854 ISR 62421 OPEN auf seriellen Bu 


in 


az4ekern 


828667 LDA 186 Ger zaetenummer in Accu 

82669 JSR 860581 > TALK. 

BS26 72 LORA 135 Sekundseradresse in Accu 

82674 ISR 0 60871 > TKSA. Sekundseradreszse zuf Rus ausgeben 
B26577 ISR 60947 > RCFPTR, Zeichen war Bus halen 

s2850 STA 174 und in den Ladezeiwer 1lcuı krinsen 

82682 LOR 144 10-Statuskute 

82684 LSR 

826585 LSR Zeitfehler keim Lesen” 

E26 BES 862768 Ja: 1rO-Errar #4. "FILE NOT FOUND" 

828588 ISR 64947 > RCPTR, Zeichen von Bus holen 

82631 STA 175 und in den Lzdezeiger hiyah krinsen 

52693 TARA Sekundsaeradresse kei Aufruf var "LORD" 

82694 BNE 827a4 unaleich rull £EAkscalut-LOARD>? IJIz: weiter kei SZrYad 
82898 LDA 195 ansonsten APFEND-Adresse kei Aufruf von "LORD" 
826893 STA 174 in den Ladezeiger uekertraguen 

szervaa LODA 136 

52702 STR 175 

szrad ISR 82930 > Aussgake "LORETNG" -"VYERIFYTING" 

82707” LOA 4253 Bit 1 «“Zeitfehler heim Lesen) 

s2r’a9 AND 144 

s2y”11l STA 144 im Status loescher 

e2713 ISR 65549 > STOP, Akfra9se der RUNSTAP-T==te 

szril& BNE 62721 RUNSTOF sedrueckt? Nein: weiter hei BZr7rzl 
s2r718 IMP 683027 > CLOSE zuf Bus zusaehen,. Flaa fuer Akkruch setzen 
52721 JISR 60947 > REFTR, Zeichen vom Eus holen 

BErz4 TAG und ins SFR retten 

52725 LDRA 144  I7’Q-Statuskute 

Ber’z2Y LSR 

82728 LSR Bit 1 “Zeitfehler keim Lesen) sesetzt? 

52729 BCS 6827407 Ja: nochmal probieren 

52731 TARA gelesenes Zeichen wieder in Accu bringen 
Ber’a2 LOY 147 Fls4 fuer "VERIFY’” gesetzt? 

82’34 BEU 62748 Neins weiter kei 682748 

g2r36 LDY #40 Index fuer Painter 

82738 CMP 174) ,7 gelesenes Byte mit Buvte im Arkheitsspeicher veraleichen 
52749 BEO 627509 Gleich?” Ja: weiter hei 62758 

82r’42 LDA #1& Bit 4 fuer Nichtuekereinstimmung 

e2r’d4d4 I5SR 65052 > Status setzen 

82747” BIT N 

82743 STA 1743 ,Y gelesenes Brte im Arbeitsspeicher aklesen 
E27508 INC 11” Lesepcinter erhoehen 

Bs2’Ya2 BNE 827585 

82754 INC 175 

82756 BIT 144 1/’0-Statuskute 

627358 BVC 82707 Bit & «End ar Indentifv> gesetzt? Nein: weiterlesen ... 
sersi ISR 80911 > UNTALK 

527653 ISR 853042 > ELOSE auf seriellen Bus zusyeken 

B2r76&6 BEC 62839 Fehler?” Nein: weiter kei 528333 

ES27ER JIMP 63236 > Trü-Error #4. "FILE NOT FOUND" 

82771 LSR Bit & der Geraetenummer in die Carrv-Flas schieben 
Ber’T’2 BCS 62777 "LORD" warn Recorder?” Ja: weiter kei 82777 
g2r7’4 JIMP 63251 > T7/O-Error #9, "ILLEGAL DEVICE NUMBER" 


257 


CE 8&©+ BHRSICc zZ eu - = = = - a7 7r 
LORD. Load und Yerifv von Programmen (Fortsetzung? 

52777 JSR 63440 > Peirter uf Cassettenpuffer nach \KRTR> 

s27’sa BCS 62785 Ist £KkRYR> kleiner 5127 Nein: weiter kei 62785 
s2782 IMP 653251 >» I/G-Error #9. "ILLEGAL DEYICE NUMBER" 

82785 ISR 63511 > "PRESS PLAY ON TAPE" 

82738 BCS 62394 Rebkruch durch RUNSTOP? Ia:s FRTS 

g2zr’a0 ISR 82895 > Im Direktmodus "SERRCHING " und Filenamen ausgeben 
52793 LDA 183 Lsense des Filenamens 

n27Y35 BED 862845 = 87 la: weiter bei 62586 

82797 ISR 63466 > Dateikopf mit verlangten Namen suchen 

s2sua BCl 62313 Fehler” Nein: weiter hei 652813 

gsz802 BEQ 82894 Akbruch durch RUNSTOP? JIas RTS 

s28a4 BCS 52768 I-Q-Error #4. "FILE NOT FOUND" 

8sz8as ISR 63276 > Dateikopf in Puffer lesen 

523093 BER 62394 RUNSTOP oder "End of Tape”? Ia: RTS (val. 623933 #5 
g>811 BCS 82768 I-O-Error #4. "FILE HOT FOUND" 

82351232 LDA 144 1.0-Statuskute 

52815 AND #15 Bit 4 “Lesefehler)> izscalieren 

62817” SEC | Flaa fuer Fehler setzen 

52818 BHE 528394 Rit 4 wvesetzt” Ta: RTS 

82820 CPX #1 PRelsati.prosramm meist BASIC»? 

52322 BEU 829341 Ja: weiter hei 62941 

52824 CP# #3 Aksolutpr aan amm Ckein RFFENOD ar Speicherantfang! >? 
B2S26 BNE 62793 Hein: weiterzuchen „.. 

82323 LDY #1 

82830 LORA 173) ,.Y7 Startsdresse zus Caszsettenpuffer 

52332 5STA 135 in Ladezeiger kringen 

528534 INY 

82335 LOA 178) .Y 

82237 STA 1985 

5252393 BCS 62945 Inkedingter Sprung 

52541 LOA 135 Sekundsaeradresse = 8 \APFEND>T 

8238423 EBENE 582828 Hein: weiter hei 582828 

528453 LDYr #3 

52547 LDA 173) .Y7 Endadresse+1 1lou des Prour amımz 

82349 LO #1 

52531 5BC 1752 ninus Startadresse \l\cw des Prour amms 

828333 TA 

52854 LD'Y #4 

82558 LDA .1783>,Y ekensc hiah 

523853 LOD’Y #2 

52860 SBC 1793 ,.Y eraikt Laerwe des Prosur amms 

82382 TAY 

823853 CLC 

82864 TA Proar ammlaenge zur 

52885 ADC 195 RPPEND-ARdresse kei Rufruf von LORD” addieren, 
82857 STA 1vY4 erqgikt die eigentliche Startadresse bei LOAD oder YVERIF'’Y 
82859 TYA i 

82870 ADC 196& 

52372 5STA 175 

82874 LDR 195 .1935.’1965 nach 1923194) vekertragen “LawWlezeiser > 
82876 5TA 133 

82878 LODRA 196& 

s2880 STA 194 

82882 ISR 8629309 > Rusgake "LORDING" kzw. "WYERIFYING" 

82885 JSR 83362 > Proaramm einlesen 

82888 BIT Fa 

82883 CLC 


258 


Br 254 BRSIC zZ - - = - - - Segen 


LORD. Laad und YVerifyv von Frogrammen “Fortsetzung? 

8285980 LOS 174 Endadresse+i1 des gelesenen Prour amms 
82892 LDY 1759 nach ÜXSRerR> uebertrasern 

82894 RTS 


Im Direktmodus Ausgake "SERRCHING " und ewti. "FOR " mit Filenamen 


82895 LOR 137 Rusaake unterdruecken (Direktmadus?? 
82537 BPL 852929 Jar RTS 

829393 LDY #12 Offset fuer "SERRCHING " 

82301 ISR 61743 > Meldung drucken 

s29a4 LOA 183 Laense des Filenamens 

s290& BEQ 52929 = a? Iza: RTS 

829RAS LDY #23 Offset fuer "FOR " 

s2s1A ISR 61743 > Meldung drucken 

82912 LDY 1:3 Laernge des Filenamens 

82915 BED 52923 = A? Ia: RTS 

82917 LO'T #4 Index fuer Filenamen auf mull setzen 
829319 LDA 187) .T eeichen aus Filensamen lesen 

82921 JITSR 865490 > CHRQLT, Zeichen im Accu ausgeben 
62924 INY 

62925 CPY 133 alle Zeichen ausgesehen? 

82927 BNE 623193 Nein: weitermachen „.. 

8629293 RTS 


ARusazake van "LORDING" kzwu. "YVERIFTING" 


529390 LOY #73 Offset fuer "LORDING" 

s2arz LOA 14” Flau fuer "VYERIFY”" gesetzt? 

829234 BED 6529338 Nein: weiter kei 62938 

8239385 LEW #33 Offset fuer "WVERIFYTING" 

52935 IMfF 6861739 > Meldung ausgehen 

SAYE. Speichern var Frour ammen 

52341 ST 174 Endadresse Jde=z Programms nach «1741755 
52943 STTr 172 

82345 TA Wert im Accu entspricht Offset fuer Endpcinter 
s22d4s LOR As Startadresse lcouı aus Pcinter 

62943 STA 193 nach «19395 

62950 LODR 1.8 und Startadresse hiah 

B29a22 STA 124 nach „1945 vekertrasen 

&2354 IMP S15> Normalwert des "Yektars (313.’31MN: 862957 
52957 LOA 185 Ger aetenummer 

52933 BNE 82964 = 8 (Tastatur)? Nein: weiter kei 629684 
829681 IMP 65251 > 1eQü-Error #3, "ILLEGAL DEVICE NUMBER" 
8239684 CMP #3 Gerzetenummer = 3 (Bildschirm>? 

s2ass BEU 62961 Ja: 1“0-Errar #9, "ILLEGAL DEYICE NUMBER" 
82963 BCC 853955 Geraetenummer kleiner 37 Ia: weiter kei 530695 
szar7a LOR 497 

82972 STR 185 Sekundaerfadresse auf 37 XSRAYVE auf seriellen Bus) setzen. 
82974 LOT 183 Laenge des Filenamens = 8? 

82976 BNE 862981 Neins weiter kei 62981 

SZ9r7S IMP 863248 > IO-Error #8, "MISSING FILE NAME" 

629981 ISR 82421 > OPEN zuf seriellen Bus ausgeben 

52994 ISR &2>119 > Ausgabe "SAYING " und Filenamnen 

82987 LORA 155 Ger setenummer 

82933 IJISR 2 606594 > LISTEN 

82932 LDA 185 aktuelle Sekundaer adresse 

62994 JSR 60857 > SECOND, Rusgake Sekundsaeradresse 


259 


CO eBr 


SRAWYE, 


52997 
62399 
53002 
sad 
53007 
52009 
53012 
53015 
53417 
53419 
53022 
53025 


53048 . 


Selstep 
5353 
530535 
53937 


SIaEm , 


Leyen le) 
s3a64 


Gh nah dhnhnnh hm 
DIGITAL 


= am AMAMSAM AU EM 


DW 19 a 1 Ban Ta Br ET Tre Kr a a Oo N a 
Na EN SAT er Bn 


er EeShnzıcl zZ - - - - = - 


Speichern „von Prosrammen (Fortsetzung) 


LD'Y 
JSR 
LODA 
JSR 
LOA 
JSR 
ISR 
BCS 
LDA 
JSR 
JSR 
BNE 


#40 
54.398 
172 
54393 
173 
80393 
54721 
53439 


„172>,Y 


50893 
55595 
53034 


185 
ayel = T=Sc 
136 
sasS4 
1853 
#239 
#224 
50357 
Sa92E 


dh MM 
[U Y  Ya 
- N m 1) 


“ER De 


mine nö 


Ti 
71) 
kumh 


> Programmstartadresse nach (1727173) <Transportzeiger) 
Startadresse low 

> CIOUT, Zeichen ausgeken 

Startadresse high 

> CIQOUT, Zeichen ausgeben 

> Pruefung, ok Ende erreicht? 

Alle Bytes ausgegeben? Ja: weiter kei 63039 
Zeichen aus Speicher lesen 

> CIOUT, Zeichen ausgeken 

> STOP, RUNSTOP-Taste abfragen 

RUNSTOP sedrueckt? Nein: weiter kei 863034 


> CLOSE auf seriellen Bus ausgeben 


Fehlercode Null fuer Akkbruch durch RUNSTOP 
Fehlerflag setzen i 


> Transportzeiger erhaehen 
Bei ncarmalem Gekrauch unkedingater Sprung 


> UNLISTEN 


seriellen Bus ausgeben 


aktuelle Sekundaeradresse 

kleiner 128? Neins fertig 

Ger s32etenummer 

> LISTEN 

aktuelle Sekundaer adresse 

Bit 4 loeschen 

Bit I kis 7 setzen “Kennzeichnung fuer CLOSE> 
> SECOND, Ausgabe Sekundseradresse 

> UNLISTEN 


Bit a der Geraetenummer in die Carrv-Fla9 schieben 
ARusyake auf Recorder”? Ja: weiter bei 63471 
> 1Trü-Error #93, "ILLEGAL DEWICE NUMBER" 


> Feinter auf Cassettenpuffer nach CXR’YR)> 
Ist (KR/YR> kleiner 5127 Ja: 1/O-Erraor #9 
= "PRESS RECORO & PLAY ON TAPE" 

ARkkruch durch RUNSTOF? Tas RTS 

> Ruszsgake "SAYING " und Filernamen 
Kennzeichnung fuer Akbszscalutprcaar amm 
=ktuelle Sekundsaeradresse 

Ist Bit ü gesetzt” 

Ta: weiter kei 820934 

Kennzeichnung fuer Rel=ativpraur amm 


>= Dateikopf in Puffer erzeugen und auf Band schreiben 
Fehler? Ta: RTS 

= Froaranım auf Band schreiken 

Fehler” Ia: RT 

al:tuelle Sekundaer adresse 

Ist Bit i wesetzt? 

Hein: fertia 


260 


C-RBri 


S+ EernsıIc W2Z - - - - - - 


SAYE, Speichern „van Programmen (Fartsetzung)d 


53111 LDRA 
63113 ISR 
53116 BIT 
523117 CLC 
83118 RTS 


Ausgake san 


83119 LDR 
83121 BPL 
83123 LD'Y 
53125 JISR 
53129 JMP 


UDTIM,. interne Uhr um 


83131 LOX 
83133 INC 
63135 BNE 
63137 INC 
63139 BNE 
83141 INC 
63143 SEC 
3144 LDA 
63146 SBC 
83148 LOA 
83158 SBC 
3152 LDA 
53154 SBC 
83136 BCC 
53158 STE 
s318a STE 
53162 ST® 


Flaa fuer 


523164 LOR 
83167 CHP 
s31r’a BNE 
5>317’Y2 TRAs 
52173 BMI 
83175 LDE 
53177 ST“ 
s>1sa LO“ 
83133 CP 
863138 BNE 
531323 STAR 
583191 IN“ 
83192 BNE 
83134 STA 
83195 RTS 


RCETIM. Uhrzeit lesen 


” SEI 
23 LORA 
a LEW 
& LE 


#2 
53333 


"SAYING 


157 
83118 


#0 
162 
63143 
161 
53143 
180 


162 
#1 
151 
#26 
160 
#79 
SCH? 
150 
161 


182 


Ss321l 
S6321 
53164 


u ag 
Th ih Oi 
ca ee) 


Kennzeichnung fuer "End Of Tape’-Block 
> EOT-Block erzeugen und auf Band schreiken 


und Filenamen 

Rusgake unterdruecken (Direktmodus?? 
Tas RTS 

Offset fuer "SRAYING " 

> Meldung ausgeken 

> Filenamen ausgeben 


eire Sfstel Sekunde weitersetzern 


LSB erhoehen 


MSB erhoehen 


mamentane Uhrzeit in 6SQ@stel Sekunden 
mit 24 Stunden (6s@stel-Sekunden-Darstellung? vergleichen 


24 Stunden erreicht? Nein: weiter bei &3164 
alle Stellen lceschen 


diverse Tasten "zur RUNSTOP-Abfrzae)> aktuzlisieren 


Tastaturdecoder ausq3an9 
zum Entprellen nach eirmal akfragen 


RUNSTOF gedrueckt? 

Nein: weiter kei 63194 

BRitmuster zur Akfrage der Reihen mit den Shift-Tasten 
Tzsetaturreihenausgang fertsetzen 

Tastaturdecoder ausaarg 

zum Entprellen nach einmal akfragen 


Her in keiner der beiden akaefraasten Reihen eine Taste 
Yedrueckt speziell Shift??? Nein: kein RUNSTOP 
Fla4s fuer diverse Tasten setzen 


261 


>23111 


CB S5=+ BRSIC zZ - - - - “ 


SETTIM, 


532064 
53205 
83207 
63209 
83211 
EI2l2 


STOP: 


83213 
83215 
63217 
53219 
632208 
63223 
53225 
63226 


1.Q-Error-Handling, 


53227 
853223 
653230 
53232 
53233 
83235 
532365 
853238 
632397 
83241 
83242 
3244 
63245 
63247 
683248 
53250 
53251 
653253 
53254 
3297 
63239 
53261 
SI2Er 
53285 
53267 
632683 
83274 
63273 
53274 
5.3275 


ser lanaten 


83275 
53278 
63279 
83282 
63283 
63285 


SEI 
STAA 
sts 
STYr 
CcLI 
RTS 


182 
161 
159 


Uhrzeit setzen 


Abfrage der RUNSTOP-Taste 


LDRA 
CMP 
BNE 
PHP 
JSR 
sSTA 
PLP 
RTS 


LDA 
BIT 
LOA 
BIT 
LDRA 
BIT 
LDA 
BIT 
LOA 


LDA 
PHR 
JSR 
PLA 
STR 
BCS 


1453 
#127 
53226 


55434 
193 


#1 
#2 
#3 


Flas3 fuer diverse Taster 
RUNSTOP alleine) sedrueckt? 
Nein: RTS 


Statusflagygs fuer spaetere Akfrage merken 
I/0O-Kansele schliessen 


> CLRCHN, aktive 
Tastaturpufferindex loeschen 
Statusfla93s5 wiederherstellen 


Einsprunastellen fuer Errors 


TOO MAN'Y FILES 

FILE OPEN 

FILE NOT OPEN 

FILE NOT FOUHO 

DEVICE NOT PRESENT 
NOT INPUT FILE 

NOT OUTPUT FILE 
MISSING FILE NAME 
ILLEGAL DEYICE NUMBER 


> CLFECHN. aktive I7/0-Kanzele schliessen 
Offset fuer "I-O ERROR #' 

Ausazbke der 1.0-Errers unterdruecken? 
Ja: weiter bei 63273 

> Melduna drucker 

Fehlercode halen 

und fuer spaetere Verwendung wieder auf 
in ASCIIT umwandeln 

> CHROUT, Zeichen im Accu drucker 
Fehlercade wiederherstellen 

Fehlerfl=ay4 setzen 


Dateikopf van Band in Puffer lesen 


Flay fuer "YERIFr” 
auf Stack retten 

> Black won Band in Puffer lesen 
Flzaa fuer "VERIF'Y” 
Fehler beim Lesen? 


wiederherstellen 
Ia: RETS 


262 


Stack 


legen 


C CErl ©+ ERHMS>SIcl zZ - - - - - - 327 


nerlangaten Dateikopf von Band in Puffer lesen (Fortsetzung? 


53287 LDY #0 

83289 LDA 178) ,'Yr erstes Zeichen im Cassettenpuffer 

53291 CMP #5 = 5 (End coaf Tape»)? 

83293 BEQ 83337 Jaı RTS 

83295 CMP #1 = 1 (Relsativuprosramm, meist ERSIC)T 

83297 BEQ 83307 Jar weiter kei 63307 

683299 CHMP #3 = 3 (Akscalutproauramm, kein RAPPEND an Speicheranfana!> 
83301 BEQ 83307 Jz: weiter hei 683307 

83303 CMP 44 = 4 “Kennzeichnung fuer Startklack eines Ostenfiles> 
83345 BNE 63276 Nein: weitersuchen. zurueck nach 683276 

83307 TAX Kennzeichnung merken 

63308 BIT 157 Rusaske unterdruecken (Direktmadus)>”7 

833180 BPL_ 83335 Ja: weiter kei 633373 

83312 LDY #939 Oftfsetpointer fuer "FOUNE " 

863314 ISR 81743 > Meldung zusgeker 

63317 LDY #5 Index fuer Filenamer 

863319 LDA 179) ,Y Zeichen aus Cassettenpuffer lesen 

863321 JSR 65490 > CHRQOUT. Zeichen ausgeken 

83324 INY Index erhcehen 

83325 CPY #21 alle 16 Zeichen des Filenamens auswemehen”? 
63327 BNE 533193 Nein: weitermachen „.. 

83329 LDA 161 mittleres Byte der internen Uhr 

63331 JSR 58592 > warten. bis Zeit vorkei ader Taste wedrueckt 
63334 NOP 

83335 CLC 

83336 DE'Y 

63337 RTS 


Dateikopf erzeusen und auf Band schreiken 


833383 STA 158 Kennzeichnung fuer Dateitvp merken 
83348 JISR 63440 > Pointer auf Cassettenpuffer nach U&R-rR) 
83343 BCLC 6863439 Ist (SPRTR) kleiner 5127 Ta: FTS 
63345 LDA 194 Startadresse hiah.- 

63347 PHR 

63348 LDA 193 Startadresse lau. 

83350 PHA 

683351 LDA 175 Endadresse high. 

63353 PHR 

83354 LDA 174 Endadresse l\cu auf den Stack lesen 
63356 PHRA 

63357 LDYV #191 Lsenge des Lassettenputffers — 1 
83359 LDR #32 Code fuer "SPACE" 

83361 STA 178) .Y Cassettenpuffer mit Sraces fuellenr 
83353 DEY 

63364 BNE 63361 

63366 LDA 158 Kennzeichnung fuer ODzteitvp 

63368 STA 173) ,'Y in erste Fufferposition schreikenr 
6337 INY 

63371 LDA 193 ebenso die Startadresse 

83373 STAA 1737,Y 

63375 INY 

63376 LDRA 194 

63378 STA 178) .Y 

63388 INY 

63381 LDR 174 und die Endadresse 

63383 STR 1785 ,Y 

63385 INY 


63386 LDA 173 
63388 STR (178) ,Y 
63398 INY 


263 


T-ERri 


Dateikopf erzeugen und suf Band schreiben 


53371 
53393 
53395 
53397 
83339 
5a 
52403 
53405 
53447 
55449 
53411 
53413 


534172 
53418 
s34Z2a 
53422 
53425 
53426 
53427 
53427 
53430 
53432 
53433 
53435 
5234236 
53439 
53439 


2344 
53442 
53444 
5344e 


nn hand 
I u Pa Buy u 7 Due Yu Fa Du ve u Sa u Va Bu Fa Be N 
BEL LELRLLLLLH 


u rs Be A ı a a rd u 


DR ı ER u ZH u Bu 0 Bar Ku SS A Be 


SAL LRLLLLL 


DI Te aa 0 En Er Dr) 


DI I I 
IR U Bun Bar | BEI En Zu Eee Ba Bay BE ZEN Er 


Pet 


aa 


ANANHTANAnAN 


ab 


wa 


+ PER=ZIc 


STr 
LD'Y 
sTYr 
LDY 
CPY 
BEQ 
LOA 
LD'Y 
STR 
INC 
INC 
BNE 


JSR 
LOA 
STR 
ISR 
TA'Y 
PLA 
STA 
PLA 
STA 
PLA 
STA 
PLA 
STA 
TrA 
RTS 


LO“ 
LDY 
CPY 
RTS 


ISR 
TARA 
STA 
CLC 


139 
40 
158 
133 
183 
524153 


1877 .YT 


159 
2178 


I.,YV 


: bestimmter 


Filenamen 


>2329>1 


Fortsetzung? 


Speicher fuer Index auf Filenamen im Cassetternpuffer 
Pointer auf Filenamen festlegen 

MHurden alle Zeichen des Filenzamens 

in den Cassettenpuffer uekertr agen? 

Ja: weiter bei 683415 

Zeichen aus Filensmen 


in Cassettenpuffer uekertragen 

Pointer =zuf Filenamen erhoehen 

Pcinter zuf Filensmen im Cassettenpuffer erhoehen 
Inbedingter Sprung zum Schleifenanfang 


> Start- und Endadresse des Cassettenpuffers festlegen 
Dauer des Header-Sianals festlegen 

> Cassettenpuffer auf Band schreiken 

entuellen Fehlerccade im YR aufkewahren 

Endadresse low. 

Endadresse hiah,. 

Startadresse cu. 

Start=adresse hiah wieder vom Stack holen 


enentuellen Fehlerccade wiederherstellen 


Pointer zuf Startadresse des Cassettenpuffers 
nach SHRTR> vebertraser 


und »eraleichen. ok (KkF’yYR) kleiner 512 


„> Startadresse des Cassettenpuffers nach (XR’YR> 


und mach 2%1932.”1945 speichern 

zur Startadresse 192 addieren, 

erasikt Endadresse+l des Cassettenpuffers 

Endadresse des Lassettenpuffers nach (174/175 bringen 


zuchenr 


> Black in Puffer "FOUNE " und Filenamen 


Akkruch? Im: RTS 


lesen. ARusaake 


Index fuer selesenen Filenamen 
Index fuer “wesuchten Filename 


mit Laerse des Yesuchten Filenzamen veruleichen 
alle Einzelzeichen bereits werslichen? Izı fertig 
Zeichen zus wesuchtem Filenamen 


mit Zeichen zus gesuchtem Filenamen »eraleichen 
identisch” Nein: naechsten Block lesen 


264 


und = 17 


Block 


63491 
63493 
63495 
53497 


53499 
653504 


63501 
83544 
63586 
63398 
83510 


ARusgake 


63511 
83514 
83518 
835193 
83521 
83324 
83527 
653529 
63531 


PLAY-Taste 


63534 
63536 
83338 
63548 
63542 
63543 


Ausgabe 


83544 
6334 


83570 
63572 
63574 
63376 
63578 
63539 
835352 
63594 
53386 


SS: FSH>SlIc 


mit bestimmten 


INC. 
INC 
LDY 
BNE 


CLC 
RTS 


JSR 
INC 
LDY 
CPY 
RTS 


ISR 
BEO 
LD'Y 
JSR 
JSR 
JSR 
BNE 
LD'Y 
JMP 


LDA 
BIT 
BNE 
BIT 
CLC 
RTS 


JSR 
BEO 
LD'Y 
BNE 


. LG 


LOAR 
STR 
STA 
ISR 
JSR 
BCS 
SEI 
LOR 
STA 
STA 
STR 
sta 
STA 
STR 
LOA 
LDX 
BHE 


158 
159 
133 
63479 


53444 
186 
1686 

#192 


63534 
53542 
#27 
81743 
53596 
83534 
83521 
#106 
51743 


akfra9ger 


#16 
1 


653542 


1 


"PRESS RECORD 


83534 
83242 

#45 
63218 


Band im 


'— [5 = = = = = 


Filensmen suchen (Fortsetzung? 


ansonsten Indexpcinter erhoehen 


und die Filenamen weiter miteinander »erqgleichen 


> Pointer zuf Cassettenpuffer nach “KR TrR> kringen 
Pointer auf Cassettenpuffer “Zeichenrzeiger> erhoehen 


Ende des Czassettenpuffers erreicht. alle Zeichen welesen” 


"PRESS PLAY ON TAPE": warten, kis PLAY-T=aste gedrueckt 


> Pruefen, ck PLAYT-Taste gedrueckt 

PLAY-Taste gedrueckt? Ja: fertia 

Offset fuer "PRESS PLAY ON TRAPE" 

> Meldung ausgeken 

> kei RUNSTOF Rueckkehr zur vekeraeordnreten Routine 
> Pruefen. ck PLAY-Ta=ste sedrueckt 

PLAY-Taste Jedrueckt? Nein: zurueck nach 863521 
Offset fuer "OK" 

> Meldung ausgeken 


P2 


Maske fuer Bit 4 (PLAY-Taste) 

Port akfrasen 

PLAY-Taste gedrueckt” Nein: weiter kei 68354 
Port nccheinmz=l akfragen zum Entprellen 


Pr) 


& PLA’Y ON TRAPE": warten. kis PLAYT-Taste Yedrueckt 


> Pruefen, ak PLAT-Taste gedrueckt 
PLAY-Taste gedrueckt? Ia:r fertig 

Offset fuer "PRESS RECORD & PLAY ON TAPE" 
Inkedingater Sprung 


Puffer lesen 


1.’0-Statusbute und 

Yerifv-Flaga ruecksetzen 

> Sstart- und Endadresse fuer Recaorderpuffer festsetzen 
= "FRESS PLATF OH TAFE" 

Rekruch durch RUNSTOFT? Iz2: weiter kei 837423 

Interrupt „verhindern 


Lesefla4 := Aktastung 
Fla4 fuer Timerfl Read) 
Timing-Koanstante 
Korrekturzaehler fuer Fass 
Korrekturzaehler fuer Fas 
Flza fuer "Brte empfangen” ryuecksetzen 
Bit 4 Ümeaative Flanke auf FLAG» 
üffset fuer Tape-Read E37 
Unkedinater Sprung 


‚= Jdizsakled 


ı Ar 


Dom 


Sl] 


265 


br ©Sı+ı PRrhzlic V2Z u Mr = - u m 235323 
Block „von Puffer auf Band schreiken 

533988 ISR 523447 > Start- und Endadresse fuer Recarderpuffer festsetzen 
83531 LDA 420 

83393 STA 171 LaerYge des Header=s var Write auf Cassette 

83595 ISR 63544 > "PRESS RECORD & PLAY ON TAPE" 

83598 BCS 63708 Akkruch durch RUNSTOP? Jar meiter kei 63798 

83600 SEI Interrupt verhindern 

s8I6A1l LOA #130 Bit Z “Timeaut von TimerB> 

s3E03 LD #2 Offset fuer Tape-Write (645618?) 

83805 LOY #127 

836807 ST? 565333 alle IR@Qs sperren 

83510 STAR 368333 entsprechenden IRQ fuer Schreiben’Lesen freigeben 
83513 LOA 36334 Contrcal Resister A 

E3&15 ORA #253 Bits 5 (Timer laden). 4 (One-Shot)> und a <Start) setzen 
36138 STAR 365339 und wieder abspeichern 

B3621 AND 41493 Bitkombkination fuer CRA fuer Neustart 

53823 STR Er nach “&74> kringen “wird in 63761 wieder gelesen? 
E36265 JTSR 81604 > warten, bis RS-232 Datenuebertragung akgeschlossen ist 
&E36529 LOAR 53265 Register #17 des Yideo-Chips . 

83832 AND #239 Bit 4 fuer BLANK SCREEN loeschen und wieder skspeichern 
83534 STAA 532653 daher keine Bildschirmausgakbe waehrend Tape-l1’0> 
53637 LDA 88 momentanen IRQ-Vektar in (78987739) nach (86717672) retten 
szäda STR sr1 

53643 LDA 39 

EIS4& STA g72 

836543 ISR 84701 >= IRQO-Vektor setzen 

83652 LDA #2 

B83634 STA 194 Anzahl noch zu: schreibende”’lesende Blacks festsetzen 
83556 ISR 84407 > Tape-Initisalisierung,. Flaas und Zaehler setzen 

535593 LDA 1 

536561 AND #31 

536853 STA 1 Reccerdermatcor einschalten 

s3682 STA 192 Flz4 fuer Recaorderkantrolle setzen 

83667 LD% #255 

8365653 LDY 42535 

83671 DET 

BE3672 BNE 636571 

3674 DES 

53575 BNE 365659 

Ss6r”r CLI Interrupt (Pead’bhrite fuer Cassette) freigeben 

SI36r’E# LDA Sr’2 Yeretteter IRQO-Vektor high identisch mit momentanem 
s3681 CMP 789 IERG-Vektor hiah Lalsc alles weschrieben.gelesen?? 
53584 CLC Fehler fla4 loeschen 

825935 BEU 837ra8 Jar fertig 

B3687 ISR 52695 > RUNSTOP-Taste abfragen 

S3E3R ISR 9 83164 = Fl=24 fuer diverse Tasten (RUNSTOP> aktualisieren 
53633 IMPF 63675 > und weitermachen ... 

E236535 ISE 068570995 > STOP. prueft RUNSTOF-Taste 

535839 CLC Fehler fl=a4 loeschen 

azsvaa BNE 837123 RUNSTOF-Taste gedrueckt? Neins RTS 

sI3rua2 JISR 64659 > Ende Recorder-I.’ü 

53745 SEC Fehlerfl=2g9 setzen 

52725 FLR Ruechsprunasdresse „om Stack entfernen 

BEra7 PIA 

e3raS LDA #0 Dn.aode fuer Akkruch 

s3rı1a STA S7E geretteten IRO-Vekteor hHiah auf null setzen 

53712 RTS 


266 


CB 5:4 RZASICclc zZ - - - - - = 


=2714 


Lassettensvnchronisstion vorbereiten 


83714 
63716 
63718 
63719 


Interrupt-Rautine 


De 


Bag Bu [BEL Eur a Be DE ER SE 5 


sT# 
LDA 
ASL 
ASL 
CLC 
AROC 
CLC 
ADC 
STR 
LDA 
BIT 
Bl 
ROL 
ASL 
ROL 
ASL 
FOL 
TAX 
LDR 
CMP 
BCC 
ADC 
STR 
TAA 
ADC 
STA 
LOR 
STA 
STA 
LOA 
ANDI 
BEQ 
LOA 


177 


175 


sR nach £K17r7Y> speichern 
Timina-Kanstante 


mal 4 
rlus Timimna-Konstante, a1l20o mal 9 


plus (177) 

und wieder dart ablesen 

Accu enthaelt Hiahkute fuer Initialisierung von TimerA 
Ist (176> groesser 1277? 

Ja: weiter hei 63733 

Carrv in untere Bitpcsition des Accus schieben 

Wert zur Initi=elisierung von Timer vervwierfachen 


Hiahkvte merken 

Ist TimerB low 

kleiner 22 “alsc Yersenderung »an TimerB hiah kis 63755) 
Ja: Zurueck nach 63742 

Laukwete fuer Initialisierung addieren 

in Timer law vekertr augen 

Hiahkbwrte fuer Initisalisierung 

zu TimerB hiyh addieren 

und in Timer hiah schreiker 


Timer starten 

Fls4 fuer "Timerfi akgelwufen” ruecksetzen 
Interrupt Cantrcil Resister 

negative Flanke auf FLRG (Tape-Read)? 
Nein: weiter kei 637865 

Adresse 83785 zuf Stack legen 


> Interruptaufruf zsimulierenr: 


Lesen son Band 


TimerE hiah Caunter 


TimerB lau Counter vom Wert 2359 zeuktr-ahieren 

Iet TimerB hiah Caunter seit 6537593 vermindert worden? 
Ja: zurueck nach 63788 = 
TimerE hiah Counter nach (177) speichern 

„verazngene Zeit low seit letzter Flanke ins <R 

Latch von TimerB mit Masimalwert (655359 »vorbelegen 


Arbeitsmoadus fuer TimerB festsetzen und TimerB starten 
Wert des Interrurt Control Reaisters (Interrupt Flags? 
nach 18755 vekertrauen 

TimerB hiah Counter vom Wert 255 zubtrahieren 
Errechnung vergangene Zeit hiah seit letzter Flanke? 
vergangene Zeit lcou nach (177) speichern 


267 


CC Br 


SI PeRHRSICc 


Interrupt-Routine zum Lesen von Band “Fortsetzung? 


53827 
63328 
63838 
63331 
83333 
63335 
63336 
63838 
53348 
63342 
638344 
639846 


653349 
653851 
653353 
63355 
63857 
53359 
638361 
653963 
63364 
63866 
63868 
633708 
83872 
539374 
63876 
683378 
533830 


653383 
53885 
653837 
63389 


63591 
53393 


63395 
63897 
63398 
639008 
63992 
63994 
63996 
63908 
83918 
63912 
63914 


63916 
63918 
63928 
63923 
63925 
63927 
63939 
63932 
63934 
63936 


LSR 
ROR 
LSR 
ROR 
LDA 
CLC 
ADC 
CMP 
BCS 
LDS 
BEQ 
JMP 


LDX 
BMI 
LDS 
ADC 
RDC 
CMP 
BCS 
INx 
ADC 


Rccu enthaelt vergargere Zeit hiah) 
vergangene Zeit durch 4 dividieren 


Ist Timings-kKanstante 


plus sa 

groesser als die Zeit seit letzter Flanke? 
Ja: keine Informationen, weiter bei 63918 
Brte empfangen? 

Neins weiter bei 63849 

> ansonsten weiter kei 864496 


Brte vollstaendig yelesen? 
Ja: weiter bei 63884 
Wert fuer kurzen Impuls 


Rcecu fuer Akfr=zge festsetzen 
Wurde, kurzer Impuls empfangen? 
Jar weiter bei 83891 

Wert fuer langen Impuls 


Recu fuer Abfrage festsetzen 
Wurde langer Impuls empfangen? 
Jas weiter bei 63895 


Ist Vveraangerne Zeit noch 1l=serser 
Nein: weiter bei 53383 
> empfangenes Byte verzarkeiten 


TimerA freigegeben? 
Neins weiter hei &8391& 
Fla4 fuer = 


"Read Error” zetzer 


Unbedingter Sprung 


Fils43 fuer Impulslaengerwechsel erhoeher: 
Unkedinster Sprung 

Flas fuer Impulsisengermechsel vermindern 
nom Abfrageuwert 


19 scwie die »veraangere Zeit suktrahierern 
und zu Karrekturflas addieren 


Korrekturflaas fuer Timings-Kanstanıte festsetzen 


Fla9g3 fuer Empfang beider Impulse 
invertieren 

und wieder abspeichern 

Beide Impuls emprfanaen? Ia: weiter hei 
empfangenes Sigrızal speichern 


Timer freigegeben” 
Nein: Interrupt =skschliessenr 


Wert des Interrurt Control Registers siehe 53816) 
erfolste Aufruf der Leserautine durch TimerA-Interrurt” 


Ja: weiter bei 639732 
TimerA akselaufen? 
Nein: Interrupt abschliessen 


Flag fuer Impulszaehlungyg loeschen 
Fl2439 fuer "Timecaut Timer” setzen 


268 


Buvrte-Header)” 


(EBr1 


SI FSHz=SIc zZ - - - - - - 


Interrupt-Routine zum Lesen von Band (Fortsetzung) 


83939 
53941 
583943 


53945 
53947 
53958 
63952 
63954 


63337 
53359 
63961 
63963 
529655 
583966 
653963 
53970 
53972 
839774 
53976 
83977 
523979 
83781 
639833 
539935 
53937 
63989 


53991 
539392 
53934 
53998 
563398 
san 
san 
s4aag 
stage 
4a 
54010 
54013 


Saale 
= Ic 5 En 
at Tu Pad 


LOR 
BPL 
BMI 


LD*S 
ISR 
LDRA 
BNE 
JMP 


LOA 
BEO 
BMI 
DEC 
BIT 
INC 
LDA 
STR 
CPX 
BNE 
TA 
BNE 
LDR 
BMI 
CMP 
BCC 
STA 
BCS 


TARA 
EOR 
sta 
LOA 
BEQO 
DEC 
EMI 
LSR 
FOR 
LEN 
JSR 
JMPF 


LOR 
BEQ 
LOR 
BEU 
LOR 


25 EMI 


IMP 


LSF 
LDA 
SEC 
SBC 
ROC 
RSL 
TAr 
SR 
INT 


IRA 


EHE 


1&3 
63931 
533308 


#166 
sid 
155 
53883 
55212 


146 
539683 
E396& 

176 

176 

40 

146 

215 
83991 


633893 


Byte „aoallstaendig gelesen? 
Neins weiter bei 63991 
ansonsten weiter hei 63884 


Hert fuer Initi=slisierung von TimerRA 

> Timing initialisieren 

Register fuer Parityvkit 

Ungleich null? Jas Paritv Error, weiter kei 63383 
> Interrupt sbschliessen 


Korrekturflag fuer Timina-Konstante 
= 80? Ja: weiter kei 639683 

kleiner null? Tas weiter hei 863966 
Timing-Konstante vermindern 


Timing-kKanstanrte erhcehen 


Korrekturflag fuer Timing-Konstante loeschen 

Mert des empfangenen Impulses mit vorherigem vergleichen 
Insleich? JIas alles in Ordnung, weiter bei 63931 

warde kurzer Impuls empfangen? 

Neins Lesefehler, weiter bei 63383 

Flsa fuer Impulslaengenwechsel 

negative Werte wegen des folgenden Compares abfangen 
Murden 16 aufeinanderfolgende kurze Impulse empfangen”? 
Nein: weiter kei 633185 

ansonsten Flasa fuer "’EOB empfangen’ setzen 

Unkedingter Sprung 


empfangenes Bit 

mit Inhalt des FKeygisters fuer das Parityvkit verknuepfen 
und dort wieder akzspeichern 

Timer freigeseken? 

Nein: Interrupt abschliessen 

Bitzaehler vermindern 

Paritvkit empfzrngen? Ta: weiter bei 63945 

ansonsten gelesernes Bit 

in serielles Shift-Register fuer empfangenes Brte kringen 
Wert fuer Initialisierung von TimerA 

> Timing initisalisieren 


- 


= Interrupt skschliessen 


Murde EOB empfansen? 

Nein: weiter bei 64024 
TimerA freigegeken” 

Nein: weiter kei 84031 

Ist laufender RBitzaehler 
neqati,? Ta: weiter kei 84431 


> kein Bute-Header zu erwarten, lanaen Impuls verarbeiten 


„er ganmene Leit seit letzter negativer Flanke halbieren 


umd won 147 zuktrahieren 

Plus der Timina-kKaoanstanten 

Erseknis verdoppeln 

er4ikt Wert fuer die Initialisierung von TimerR 
> Timina initialisieren 

Flas4 fuer "Bute empfangen” setzen 

Timer freisgegeken” 

Tas weiter bei 84453 


269 


CC Br 


S+ PRASIc "ZZ - - - - - - 


Interrupt-Rautine zum Lesen van Band “Fortsetzung? 


gast 
54052 
64055 
64057 
64059 
64a6l 
54963 
6465 
64068 
64970 
64872 
64974 
6476 
640783 
64984 
64983 
64085 
64987 
6499 
64931 
64993 


840965 
84499 
54101 
84103 
54106 
64103 
54110 
84112 
84114 
54116 
84118 
84120 
S4122 
4124 
84125 
54127 
64123 
584132 


64134 
64136 
64138 


s4idl 
54143 
84145 
84147 
584149 
84151 
64153 
54155 
841565 
54158 
84164 
84162 
54163 
84165 
84167 


LDA 
BEQ 
STR 
LDRA 
sSTA 
LDR 
sTtA 
STR 
LDA 
sSTA 
BE® 
LDA 
sSTA 
LDA 
STA 
LOA 
STR 
LDA 
ORA 
STR 
I’MP 


JSR 
STA 
LDX 
JSR 
LDR 
BEQ 
STA 
LDR 
BIT 
BPL 
LDA 
BNE 
LD* 
DEX 
BENE 
LOAR 
ISR 
BNE 


LOA 
STR 
JMP 


BVS 
BNE 
LOR 
BNE 
LODR 
BNE 
LOA 
LSR 
LDOR 
BMI 
BCC 
CLC 
BCS 
RAND 
sta 


158 
64033 
168 
#0 
150 
#123 
56333 
138 


ssase 
854138 


#0 
170 
ss2lez 


54192 
64169 
181 
64138 
182 
54138 
167 


187 
84163 
S413E 


S4155 
#15 
iva 


Murde EOB empfangen” 
Nein: Interrupt akschliessenr 
Fla4 fuer Lesefehler setzen 


Flag fuer EOR ruecksetzen 


TimerA-Interrupt freigeben 

Fla4 fuer "Timer enakled” setzen 

Flz4 fuer ’EOB empfangen” 

in Flas fuer "qweltiges EOB empfangen” uekertragen 
kein EOB? Jar weiter kei 84083 


Flasu fuer "TimerR dissakled setzen” 


TimerA-Interrurt sperren 

Inhalt des seriellen Shift-Reaisters fuer Read 
in Register fuer gelesenes Brte bringen 

Flags fuer Lesefehler «“Parity etc.?> 

mit Fi29 fuer Impulslaengenwechsel verknuerfen 
ergibt Fla9 fuer Lesefehler des gesamten Bytes 
> Interrupt abschliessen 


> Flaa= ruecksetzen,. Zaehler initialisieren 
Flsas94 fuer "Bute empfangen” ruecksetzen 
Wert fuer Initialisierung von TimerA 

> Timing initialisieren 

Anzahl noch zu verarkeitende Blacks 

= @? Ia: weiter kei od4dili2 

Anzehl noch zu lesende Blocks nach (167 
Maskerwert fuer Zaehlung vor Lesen 

Flag fuer Lesen van Cassette = Ende” 


O4 


’ vebkertragen 


alle erwarteten Zeichen empfangen? Ta: weiter hei 84141 


queltises EOB empfangen? 
Ja: weiter kei 684134 
Anzahl nach zu lesende Bluachs 


= 1? 
Nein: Interrupt =kschliessen 
Bit 3, "Long Block” 


> Status setzen 
Unbedingster Serung zum Interruptabschluss 


Flza4 fuer Lesen won Cassette auf Abtastung setzer 
se 


> Interrupt akschliessen 
Flaa fuer Lesen van Tzpe = Lesen” Iar weiter bei 64192 
= Zaehlunga? Ja: weiter kei 641592 


EOR empfangen? 

Ja: Interrupt abschliessen 

Brte-Lesefehler”? 

Ja: Interrupt abschliessen 

Anzahl noch zu lesende RBlacks 

Bit @ in Carry schieken 

gelesenes Bute 

Bit 7” gesetzt “Zasehlurmaskute)? Jar weiter kei 584163 
noch zu lesende Blocks = 17 Nein: weiter kei 54136 


nach zu lesernde Elnockzs = 17 ITar weiter bei &412E 


Bits & kis 3 isolieren 
und fuer Zaehlung akspeichern 


270 


=S4051 


cC- Br 


Interrupt-Rautire zum Lesern „van Band 


641659 
84171 
64173 
64175 
64177 
5413 
64132 
684134 


64136 
84133 
54170 
654192 
54194 
54196 


84221 
64223 
642253 
4227 
54223 
54231 
433 
a42235 
842.37 
54239 
54241 
4243 
54245 
4er 
54243 
54232 
54254 
= Peter 
54253 


Ah nd hc cn 
EL LLLLLLLLL 


MDMURID ASPIRE DJ Pu By 


DB u BL 5 ec S BT aaO En Be a Dr cr 5) 
n& Prien 


+ PFHS>SICc 


DEC 
BNE 
LDA 
STA 
JSR 
LOA 
STR 
BEQ 


LDR 
STA 
BNE 
LDA 
BEO 
LOR 
ISR 
LOA 
JMP 


JSR 


93 BECC 


IMP 


LD% 
DEX 
BEQ 
LOA 
BER 
LDY 
LOA 
CMP 
BER 
LOA 
STA 
LDA 
BEO 
LOS 
CPx 
BCC 
LD% 
LDA 
STA 
LOA 
STA 
IN% 
IN“ 
ST% 


IMPF 


LO; 
[F# 
EEÜ 
LOA 
I 01 == 
RHE 
DA 
LP 
BHE 
IHE 
IHC 


ira 
54133 
#64 
ı1va 
64338 
#0 
171 
54133 


ıIı 
EN 


IF ııı 
4 » 
ee) Pe DI ee m 


NE NEN ENT, 


Dal Wh DW ND 


Fr 


„. 
r er 


% . 
r 27 


„a 


Le = = = = = = 


Fartsetzung)d 


Zaehler „erminderrn : 
Nein: Interrupt abschliessen 

sef1l23 Lesern 

Prcoar ammstartadresse in Lsdezeiger uvuebertraser 


Le 
> 


Pruefsummenwart lceschen 
Abschluss IRQ 


Lesef124 Ende 

Abschluss IRND 

End OF Block “EOR) emrfangen” 
Nein: weiter hei 642065 

Bit Z “Shart Block) 

> Status setzen 

Lesetla4 Aktastung 

> weitermachen ... 


> Ende erreicht”? 
Nein: weitermachen ... 
> Erde Read Block) 


noch lesende Blocks 


= 17 


zu 
Ja: Fass}. Korrekturpsss 

Fl=a4 fuer "YERIFY” gesetzt? 

Nein: weiter hei 54235 

Index :ı= a 

gelesenes Bute 

mit dem im Speicher stehenden vergleichen 
Gleich: weiter kei 64233 


Fla49 fuer Zeichen-Lesefehler setzen 
Fehler zufswetreten” 

Hein: weiter hei 64314 

bereits 31 Fehler 

aufsetreten” 


Ja: Bit 4 nicht korrigaierbarer Fehler) im Status setzen 


Index fuer Lesefehler 
laufendes Adresskuote hiah 
im Stack speichern 
laufendes Adressbute lau 
ekensa 


Index um zwei erhceher 
und akspeicherr 
> weiter hei 84314 


bereits alle Lesefehler 
korrisiert? 

Ja: weiter bei 654335 
laufendes Adresskvte cam 

mit fehlerhaftem Adresskrte low verqyleichen 
Imsleich: weiter hei 64323 

laufendes Rdressbote Hhiah 

mit fehlerhaftem Adresskbvte high veraleichen 
Ingleich: weiter kei 64323 

Fa==s2 


Horrekturzasehler um zwei erhoehen 


271 


=>+1572 


alle Synchronisationsbkvtes empfangen?” 


CB 84 BRASIC 


Interrupt-Routine zum Lesen von Band “Fortsetzung? 


642838 
542909 
654292 
64294 
64296 
64298 
54300 
64301 
64393 
64305 
64307 
54389 
64312 


54314 
64316 
64318 
84319 
64321 
64323 
64326 


64323 
64338 
64332 
64333 
64335 
64338 
64341 
64343 
684344 
64346 
54348 
64359 
64352 
64354 
64356 
64358 


643608 
64363 
64366 
64368 
64378 
64372 
64374 
64376 
64379 
64382 
84334 
64336 
643938 
64390 
64392 
64395 


LDA 


BEQ. 


LDR 
LDY 
CMP 
BEQ 
INY 
sSTY 
LDA 
BEQ 
LDRA 
JSR 
BNE 


LDA 
BNE 
TAY 
LDA 
STR 
JSR 
BNE 


147 
64393 
1893 
#0 


c172),Y 


84323 


132 
182 
84314 
#16 
650952 
654323 


147 
684323 


139 


172,7 


54731 
654395 


#128 
170 


#1 
56333 
56333 

190 


54348 
190 
167 

64368 
158 

64395 


171 


172>,Y 


171 
171 
54731 
84721 
584370 
171 
189 
64395 
#32 
65052 
65212 


Yerifv-Fla9 gesetzt? 


Nein: 


weiter kei 64303 


gelesenes Bvrte 


Index 


mit dem im Speicher stehenden Eyrte vergleichen 


ı=> 9 


Gleichs weiter kei &43273 


Fehlerflas4 setzen 
Fehler aufgetreten? 
Nein: weiter kei &4314 


Eit 4 


(Lesefehler, YERIF'Y-ERROR)? 


> Status setzen 
Inbkedingter Sprung 


Verifv-Flag gesetzt? 
Ja: weiter kei 64323 


Index 


ı= a 


gelesenes Byte 
abspeichern 

> Pointer erhoehen 
Abschluss IRQ 


Leseflas := 


Ende 


TimerR-Interrupt verhindern 
Interrupt-Flaas ruecksetzen 
Anzahl noch zu verarkeitende Blacks 


= 8? 


Ja: weiter kei 64348 

neuen Wert speichern 
Blockzaehler „vermindern 

= 8? Ja: weiter kei &Ed3sda 
Fehler in Passl aufgetreten” 


Ja: 


weiter kei 8654395 
Anzahl noch 


zu verarkeitende Blocks 


Abschluss IFR®O 


> Ende Tspe 1.0 


> Prcarammstartacresse in Ladezeiger uebertrager 


Pruefsumme loaescher 
Pruefsumme bilden 


> Transportzeiser erhsehen 

> Ende erreicht? 

Nein: weitermachen ... 
Pruefsumme mit 

selesener Pruefsumme »ersleichen 


Gleich: 


Bit 5 


weiter kei 64395 
(Pruefsummenfehler) 


> Status setzen 
> Abschluss IR® 


272 


8 


Ss. = 33 


C-EBnr 


+ PeHz>Ic 


Proyrammstartadresse in Transportzeiger uehkertragen 


654338 
544089 
84402 
54404 
84406 


LOR 
STR 
LODA 
sSTA 
RTS 


174 
173 
193 
172 


Prcoagrammstartadresse high 
in Transpaortzeiger kringen 
Prosrammstartadresse low 
in Transportzeiger kringen 


Vorbereitung fuer Byrte-Read’blrite 


54407 
684409 
84411 
84413 
64415 
84417 
84419 
84421 


LDA 
STR 
LDA 
STR 
STR 
sTA 
STA 
RTS 


#8 
153 

#0 
184 
158 
155 
159 


8-Bit-Zaehlunga vorbereiten 


Bit-Impuls-Flag9 

Lesefehler 

Paritv-Bit 

Flag fuer Impulslaengerwechsel 


Impuls auf Band schreiben 


684422 
84424 
654425 
54427 
54429 
54431 
54433 


64436 


64439 
64442 
64444 
64447 
64449 
64451 
64453 
64455 


Flag fuer 


54456 
84457 
54459 


SEC 
ROR 
BMI 


"Block yeschrieken” 


182 
64521 


serielles Bit-Shift Register 

Bit a in die Carrv-Flag schiekenr 
Wert fuer "short" “kurzer Impuls) 
Carry = 0? Ja: weiter kei 5443] 
Wert fuer "lang" Ülanser Impuls) 
Timer-hert hiah 

Recu in TimerB lau Latch 

“R in TimerB hish Latch 
Interruptflagsr ruecksetzen 


TimerB starten 

Tape-Write Bit 

imvertieren. 

da Impuls =al= Yoallwelle “sespeichert wird 
momentanen bert in Zera-Flagy 


setzer 


Fla93 fuer "Block geschrieben” nesatiıv, machen 


Akschluss IRO 


Interrupt-Rautine fuer Schreiben zuf Band (Puffer? 


4461 
54463 
84465 
84467 
64469 
84472 
84474 
g447E 
84475 
64430 


84433 
84485 
54487 
54490 
54492 
64494 


LDA 
BNE 
LDA 
LOS 
JSR 
BNE 
INC 
LDA 
BPL 
JMP 


LDA 
BNE 
ISR 
BNE 
INC 
BNE 


163 
54433 
#16 
#1 
54433 
84521 
183 
182 
4521 
54599 


159 
54496 
854429 
84521 

153 
84521 


"kyte"-Imeulzs geschrieben? 
Jas weiter kei 54433 

Wert low, 

Mert high fuer "kute”-Freauenz 

> "kute"—- Impuls zuf Barıd 

falls noch erste Hzlkwelle, Akschluss 

Flag fuer ""kute"-Impulz geschrieben” 

Flag fuer "Eloack seschrieken” pasiti'r? 
Ja: Akschluss IFO 

> Fortsetzung Write. 


IFEQ 
setzen 
nal. 
warm Bloch geschrieken 
"long"- Impuls seschr ieken” 
Jas weiter hei 684498 
> "lana"-Impuls zuf Band 
falls noch erste Halkwelle, 
Fl34 fuer ""laona"—- Impuls gVeschrieken” 
Akschluss IRQ 


Abschluss IRQ 
setzen 


273 


BHTEe FR) 


ce &+ BHSIC WwZ - - - = - - >49 


Interrupt-Rautine fuer Schreiben auf Band (Fortsetzung? 


54496 JSR 684422 > Bit zuf Band 

54493 BNE 84521 falls noch erste Halkwelle, Abschluss IRQ 
54501 LDA 184 Bit Imeuls Flas 

54503 EOR #1 imwertieren 

54505 STA 164 und speichern 

84507 BED 34524 wenn. a, ‚dann keide Bit-Impulise geschrieken 
54549 LDA 1393 Bit @ im Bit-Shift-Resister invertieren 
545211 EOR #1 logisch 8 wird als "shartlong", 

54513 STA 1893 losisch 1 a1l= "longrshort" Yespeichert 
84515 AND #1 Iifd. Bit herausfiltern 

84517 EOR 155 mit "Paritv-RBit fuer Byte’ verknuepfen 
8645173 =TA 155 und dort wieder abspeichern 

e4azi IMP 65212 = Rkschluss IRQ 

84324 L5SR 1393 Bit herausshiften 

S4sze DEC 163 8-Bit Zaehler vermindern 

84523 LDA 163 Ende erreicht? 

845320 BEQ 54398 Ja: Pruefsumme kilden 

84532 BPL 84521 Nein: weitermachen, Abschluss IRO 

545234 ISR 9 Sd4dır? > 8S-Bit Zaehler setzen, Flzaas etc. loeschen 
545337 CLI 

54538 LDA 165 Synchronisationsbutes geschrieben? 

5.4540 BED 5456509 Ja: weiter hei 64560 

84542 LOS 40 

84544 STH 213 Puffer -Pruefsumme loeschen B 

54545 DEC 153 Syrnchronrisationszaehler vermindern 

54548 LOS 1304 Anzahl nach zu schreibende Blocks 

s4a2a CPH #2 = 2 ferster Block geschrieben?” 

Ss45sz BNE 64556 Nein: weiter kei 64558 

5.4524 ORA #128 Bit 7” im Synchronisationsbyte setzen 
8435968 STA 139 in Bit-Shift-Register bringen 

5453593 BNE 64521 Abschluss IFRND 

54568 ISR 0 Bdrzl >= Ifd. Adresse mit Endwert vergleichen 
E55 BIC 64575 Kleiner: weiterschreiker 

&435.5 BNE 84456 Imngleichs: Flas fuer "Black seschrieken” setzen 
S45857 INC 173 zsanst Ifd. Adresse Chiah> ungleich machen 
84283 LOA 212 Fuffer-Pruefszumme 

84571 STA 1393 in Bit-Shift-Resister kringen 

245723 BCS 64521 ARhschluss IR®O 

54570 LD'Yr #4 Index :ı= 0 

&47"7 LOA lv .T laufendes Zeichen im Speicher 

5453793 STA 133 in Bit-Shift-Resister kringen. 

E47221 EOR 212 Pruefsumme 

54533 STA 219 kilden 

54535 ISR 84731 > Pointer erhoehen 

E45335 EBENE 84521 Akzschluss IRO 

54530 I.DA 135 Fzaritv-Bit fuer Bvte 

54592 EOF #1 im,ertieren 

545934 STA 1393 und inz Bit-Shift-Reuister bringen 

545965 IM oO 85212 > Akschluss IRU 


274 


CO Br1 


Fortsetzung der Write-Rautine, 


64599 
846501 
64603 
64606 
6465083 
64610 
84612 
64613 
64616 


IRQ #1, 


64618 
64620 
64623 
64625 
64627 
64629 
64632 
64634 
64636 
64638 
64641 
64642 
64644 
64646 
64648 
64651 
64653 
64655 
64657 


Ende-Recorder-I’0O 


64559 
64669 
64661 
64664 
54666 
64669 
64672 
84674 
64677 
64688 
64683 
64685 
64638 
64691 
64694 
64695 


64696 
64699 


IRQ-Vektor 


64701 
64794 
64707 
64718 
64713 


er RBSHRSIC 


DEC 
BNE 
JSR 
LDA 
STA 
LDX 
SEI 
JSR 
BNE 


LODA 
JISR 
BNE 
DEC 
BNE 
JSR 
DEC 
BPL 
LD*S 
JSR 
CLI 
INC 
LDRA 
BEOQ 
ISR 
LDS 
SsT- 
ST* 
BNE 


PHP 
SEI 
LDR 
ORR 
STR 
JSR 
LDA 
sta 
JSR 
LDR 
BEQ 
STR 
LDA 
sTA 
PLP 
RTS 


ISR 
BEQ 


LDA 
STA 
LDR 
sta 
RTS 


199 
64605 
54714 

439 

167 

#8 


ea4r’ol 
84396 


Schreiben des 


#128 
64431 
64596 

167 
54596 
84407 

171 
84396 

410 
84701 


171 
1928 
64696 
64393 
#9 
165 
182 
54334 


232685 
#16 
33265 
684714 
4127 
56333 
549839 
672 
64694 
89 
671 
788 


54659 
84596 


setzen 


54915,% 


798 


84916,% 


89 


falls Black seschriekhen 


noch zu schreikende Blocks 
= 98? Nein: weiter kei 846065 
> Reccordermator ausschalten 


Zaehler fuer Laenge der Shorts 
Offset fuer IRD #1 fuer brite (64613) 


> IRQ-Veltor setzen 
Aeschluss IR®O 


Headers 


"header"- Impuls 

> schreiken 

falls noch erste Halkwelle,. Akschluss IRO 
Zaehler fuer Header vermindern 
Ende. erreicht”? Nein: Akschluss IR®O 
> 8-Bit-Zaehler setzen, Flaas etc. 
Dauer der Shorts var und nach Daten 
Ende erreicht? Nein: Akschluss IR 
IRQ #2 fuer Write (öd4d4El) 

> IRQO-Veltor setzen 


lceschen 


Dauer der Sharts 

alle Blocks geschrieken” 

Ja: weiter kei 646965 

> Zeiger zuf letztes Zeichen setzen 


Syvnchranisastionszaehler setzer 
Flag fuer "Block geschrieben” 
Inkbedinater Sprung 


ruecksetzer 


Status retten 
IRQ verhindern 


Bildschirminh=alt wieder sichtbar machen 
> Recardermotor ausschalten 


alle CIR 8525-IRQs sperren 

> Timer Interrupt fuer Tastzturskfrage setzen 
Ist Hiahkvte des weretteten IFQs 

= 8? Ja: fertig 

geretteten IRQ-Vektar im IRQ-Vektaor uebertrauer 


Status wiederherstellen 


> Ende Recorder-T.'C 
Akschluss IR® 


Viert aus Takelle in 
IRQ-Vektor bringen 


275 


CO Er 


=I4 FHR>Ic 


4,714 


Hilfsrautinen zur Bedienung des Recaorders 


54714 LOA 
4716 ORA 
54718 STR 
s4r2a0 RTS 


4721 SEC 
s4r2z2 LOA 
64724 SBC 
54726 LDA 
54728 SBC 
54730 RTS 


1 INC 
3 BHE 
> INC 
vRTS 


n hy 


4 
4 
4 
4 


I 3) 


FG 
r 
v 
r 
RESET-Rauti 


54733 LO 
4748 SEI 
4741 Tas 
54742 CLD 
54743 ISR 
84746 BNE 
54743 .IMP 


„ 
2 
» 


Test. ch SH 


ne, Rufruf 


4255 


S4vrea 
= Te! 
32768) 


Lortridse 


a 
n. 
Ja 

R 


De re - 
De ef 


initi 


Fecardermatcor ausschalten 


Transportzeiswer mit Endadresse veraleichen 


Transpartzeiwer erhoehen 


keim Einschalten 


Sstackpcinter initialisieren 


> Cartridse eingesetzt? 
Nein: normaler RESET 
Sprung in SK Cartridge ROM Area 


-, 
. 


eset—-RBit ruecksetzen 
I-G-Reset 
freien Speicherplatz bestimmen 
Yelitaren van 788 kiss 3519 festlegen 
Fernzsehmorm“ Taktfrequenz feststellen 


Sprung nach 58260, Fortsetzung RESET-Routine 


ROM Rrea 732768 bis 44959) beleat 
Bereich 

non 547234 Kiss 
van 327 Y2 Kis 


wmaleich”? Tas 


83 mit dem 
SS neraleichen. 


alle Evtes pruetfen 


43 "CcBNSa” 
alisieren 
Accu TR) 


54816. Startadresse der Standardvektoren 


Fl=4. fuer "Tabelle mach Vektoren” setzen 


276 


YECTOR: Lesen und Setzen der Serunawwektaoren 


54794 
64796 
654798 
84504 
84393 
54305 
849307 
645099 
84912 
64813 
64315 


64816 
64818 
64328 
84322 
649324 
64326 
64328 
64339 
84832 
64334 
654836 
64338 
64349 
84342 
54344 
64346 


sTt® 
ST'r 
LO 
LDA 
BCS 
LDR 
STR 
STR 
DE'Y 
BPL 
RTS 


195 
196 
#31 
383 


54307 
«195),Y 
ID .Y 


7883 


843a4 


234 
254 
254 
243 
242 
242 


242 


243 
241 
241 
246 
241 
243 
254 
244 
245 


r. y 


‚Y 


39953 
65126 
85095 
52282 
52097 
81966 
82032 
52259 
61783 
518398 
83213 
681758 
82253 
85126 
62629 
852957 


Pointer setzen 


Zaehler fuer 15 Vektoren setzen 
Wert aus Vektortabkelle lesen 
Takellenwert in anderen Bereich kopieren? Isa: 


Wert in Yektortzbelle uekertraser: 


IRQ-YVektar 
BRK-YVektor 
NMI-Vektor 
OPEN 

CLOSE 
CHKIN 
CHKOUT 
CLRCHN 
CHRIN 
CHROUT 
STOP 

GETIN 
LLALL 


LORD-Yelkteor 
SAYE-YVektor 


Pruefung auf freien BASIC-RAM Bereich ' 


64348 
54350 
64851 
54854 
84357 
64368 
84961 
54963 
654365 
54567 
54369 
584871 
54872 
54574 
843765 
84379 
548308 
54381 
64383 
54385 
84387 
54383 
54390 
84392 
64894 
643985 
54397 
64339 
54909 
54902 


LDA 
TAY 
STA 
sTa 
STR 
INY 
BNE 
LDs 
LDY 
sT« 
STYr 
TA’r 
LDR 
sta 
INC 
LORA 
TAs 
LDA 
STR 
CMP 
BNE 
ROL 
sta 
CMP 
BHNE 
TARA 
sSTA 
INY 
BNE 
BEQO 


64 


#0 


2 


Ssi2 
‘683 


351 
#609 

#23 
178 
173 


#3 
174 
194 


T 
‚vr 
‚r 


21337 .Yr 


#35 


1935. 
193) ,YV 


&4 


sag 


Bereich 2. “ao. seäsr > r 


PR VR> 


in Pointer zuf Cassettenpuffer kringenr 


YR 
Startadresse high — 1 fuer RAN-Test 


Peinter hiah um eins erhcehenr 


„orherigen Wert merken 

Bitmuster alaıalal 

in Speicherstelle schreiben 

umd vergleichen. ck akgespeicherter Wert Jarın 
Nein: kein RA mehr, weiter kei S490d4 

sollte wchl ASL sein, eraikt aber 1a1la1lall 

in Speicherstelle schreiker 

und »ersleichen,. ch abhwespeicherter Wert derin 
Nein: kein RAM mehr, weiter kei S49ad 


gemerkten Wert wiederherstellen 

Index erhoehen, Pzaaeende erreicht? 
Hein: weitermachen 
sonst auch Fointer hiah um eins erhoehen 


277 


-S12,...,.1023) mit @ fuellen 


ı= 828, Startadresse des Cassettenpuffers 


C Er 84 BRARSIC zZ - - = - - - 


Pruefung auf freien BASIC-RAM Bereich (Fortsetzung? 


54904 
5435 
684906 
54908 
54909 
54912 
84914 
54917 
584919 
54922 


TrA 
TAS 
LD'Y 
CLC 
ISR 
LDRA 
STR 
LDA 
STA 
RTS 


Pointer low 

ins *R 

Pceinter hiah ins "TR 

> Painter auf Ende des Arbeitsspeichers setzen 


Startadresse high des Speicheranfanss (MEMBOT? 


Startadresse high des Bildschirm-RAMs 


Takelle der IRQO-YWektcaren fuer Recarder-Bedienung 


54923 
549253 
84927 
64923 


108 
2as 
49 
44 


I’O-RESET 


54931 
54933 
84936 
54933 
584942 
4944 
54947 
54950 
54923 
54956 
64958 
4961 
84964 
54367 


De) 
2 
oo 


Pride 
Lernen MD AL cd 


I 
L 
BSG add 


LOA 
STA 
STR 
sta 
LDA 
sta 
STR 
sta 
sta 
LD*S 
st“ 
STx 
st“ 
DE“ 
ST“ 
LDR 
STA 
LOR 
STA 
LOR 
STA 
LOA 
STA 
LOA 
BEQ 
LORA 
STA 
LOA 
JMP 
LER 
STA 
LO 
STA 
IMPF 


252 
251 
234 
249 


362333 
565931 
40 


PU u 


TNWO N 


SETNAM: Festsetz 


STA 
STH 
STY 
RTS 


54518 
54461 
39933 
523738 


ma der Daten 


Hrite #1 auf Cassette (Header)? 
Hrite #2 auf Cassette (Puffer? 
Harmalwert (Tastaturakfrage etc.?> 
Read von Cassette 


slle IRß=s 
und alle NMIs sperren 


A der IRQ-CIRA 
NMI-CIRA 
IRQ-CIR 


NMI-CIA 


Control Resister 
Control Register A der 
Control Register R der 
Contrcol Resister k der 


gesamten Port B der IRQ-CIR auf Eingang setzen CKeykasrd) 
ekensa Port B der NMI-CIR (User-Port> 
Lautstserke des Synthesizer-Chips auf null setzen 


gesamten Port A der IRR-CIR auf Ausgang setzen (Kevkoard? 


Port AR CHMI-CIA> 

Bit @ kis Bit 5 won Part A CNMI-CIA> 
Eit & und Bit 7” auf Eingang 
Bitmuster 111a4111 

in 86S10-Daterpaort schreiken 
Bitmuster aa1laıılll 

in SI1A-Datenrichtungsresister schreiben 
Fla4 fuer Taktfresauerz (Fernsehnormakhaengaig? 
Fernsehnorm = PAL? Hein: weiter kei $7Ada4 
Wert 16421 fuer Interrurt nach Timer RA 


auf Rusgyanıaı setzen, 


Wert 1745 fuer Interruert nach Timer A 


539 


5 


> weiter bei 
fuer den Filenamen 
Laerse des Filenamens 


Startscdresse des Filenzmens low. 
High 


278 


SETLFS: Festsetzung der OPEN-Parameter 


es5a24 STA 184 Filenummer 
55025 STX 135 Ger aetenummer 
85028 STY 195 Sek:undseradresse 


85933 RTS 


RERODST: 1.C-Status in’ Accu bringen: 


85831 LOA 136 Ger aetenummer 

s5a33 CMP #2 =2 “<RS-232 Kanal)? 

85435 BNE 859509 Nein: Bus’Tape-Status, weiter kei 685050 
854037 LDA 563 RS-232 Statuskvte 

85044 PHRA merken, 

65441 LDA 40 

s5A43 STA 563 lceschen. 

85045 FLA alten Status in Accu 

85047 RTS 


SETMSG: RAussskemoadus fuer Betr iehscevstemmeldungen setzen 


65943 5TA 157 Ausasbeflag, Flas #uer Direktmodus 
55058 LOA 144 Statuskyvte lesen 


Einsprung fuer ’"Status setzen” 

865052 ORA 144 im Accu wesetzte Bits im 
8650954 STA 144 Statusresister setzen 
s5aS6 RTS 


SETTMO, timeout-Jdisskle lceschen “Accu=0),. setzen ".Accu=128) 


65957 STA 545 timeaut-disakle z 
s5a68 RTS 


MEMTOP. Lesen “Carrv=1) und Setzen Carrv=i) des Speicherendes 


85061 BCC 6509589 Carry gesetzt? Nein: weiter kei 624653 
e5as3 LDX 5423 Speicherende lcu ins "FR, 

85956 LDY 544 higah ins "TR 

85A59 STA 843 “Rt nach Speicherende 11cm. 

85072 STYr a4 YR nach hiah speichern 

85975 RTS 


MEMBOT, Lesen “Carrv=1> und Setzen (Carrv=i) des Speicherkesinn® 


85976 BCC Bad Larry gesetzt? Nein: weiter bei S7034 
5575 LDS ag Speicherbesirn lcom ins XP. 

s59481 LDY E42 KHiah ins TR 

s5a84 ST 841 sR nach Speicherende Ic. 

sIag7 STY 842 Ye nach hiah zspeicherHn 


ssaga RTS 


279 


CE = + EHZIc zZ - - - - - - 509521 


NMI-Rautime. Rufruf durch RESTORE-Taste 


55491 SEI 

s2a32 IMP .v92)> Noermalwert des Yektors (792.793): 659095 
85035 PHRA Resister retten 

BIA9E TARA 


85497 PHR 
ssass TTA 


s51ma LDA #127 

851 STA 5365589 alle NMIs verhindern (Interrurt Control Resister)> 
55143 LOYV 565933 Rufruf durch RESTORE-Ta=ste? 

55108 BMI 855138 Nein: weiter kei 655138 

85110 ISR 84770 > Cartridge eingesetzt? 

55113 BNE 85118 Nein: normale NMI-Rautine 

585115 IMP 32770) > Sprung in SK.Cartridse ROM Area, Warmstart-Vektor 


HMI-PRoautine,. Rufruf durch RESTORE-Taste Fortsetzung? 


EI118 ISR 863164 > Flau fuer diverse Tasten “RUNSTOP> aktualisieren 
5121 TSR 65305 > STOP-Taste wedrueclkt? 

85124 BNE 55138 Nein: weiter kei 851233 

salzes ITSR 2654799 > RESTOR: Yektartzkelle (TE8,...,8195 initialisieren 
85129 TSR 854931 > 1IvO-Reset 

s5132 ISR 5565483 > Screen Editor Reset 

55135 IMP 240982) > 593235: BASIC-WHaermstert 


NMI-Handlina fuer RS-232 


5512328 TTrA ert zau= dem ICR 

552137 AND 52 mit dem RS-232 Reswister fuer aktive NMIs verknueptfen 
85142 TR und inz XR retten 

52143 AND #1 Merden Daten ueker den RS-232 Kanal gesendet” 

5145 BED 835187 Nein: weiter bei &5197 

85147 LOAR 2 585976 Fort A der NMI-CIA 

551520 AND #251 Bit Z fuer RS-Z232-QUT (fuer ORAR> auf null setzen 
Aainez ORA 181 zu sendendes Bit in den Wert fuer Part R hineinkringer 
55124 STAA 2 565976 and wieder in Fort A akzspeichern 

83157 LOA A723 Hert zus RS-232 Fesister fuer aktive HMIs 

sSleli STA 56599 in Interrupt Control Resister {NMI-CIR> uebertragen 
52163 TasA aktive NMI= fuer RS-232 Datentransfer 

s5184 AND #12 Bits 1 und 4 iscalieren {HMIs fuer Datenrempfana?> 
EA21558 BED 55191 Beide Bitz welcescht? Ia: weiter bei 85181 

BSa18E AND #2 Aufruf der NMI-Routirne durch Timecaut von TimerB’” 
Ealrl BEO 85178 Hein: Stzartkit, weiter kei 55178 

ES5172 ISR 85238 > empfangenes Bit verarbeiten 

Balz ITMF 0655181 > weiter kei 585191 

Sally TSE oO 69287 > Daterempfana fuer Byte neu vorkereiten 

55171 I5SR 6861115 > Wekertraaung des naechsten Eitz vorbereiten 

585134 TMP 65208 > Akschlu=s= RS-222 NMI-Handl ins 

Balls TARA 

BOISE AHEO #2 werden Daten empfangen?” 

521930 BED 65198 Hein: weiter kei 65198 

219, TSR 69239 = emp fangernes Bit versrheiten 

137 TIME oO 52a > Abschluss FRS-222 NMI-Handling 

mon TER 

rn'23 AHD #1 wird auf Startkbit wVeusartet” 

Eac) BEI ESIE0OE Hein: Abschluss FRS-2232-HMI 

af TS oO SIERT > Datenempfzna fuer Bete neu S„orkereiter 


280 


Cr &+ BrRrSIlcl "zZ u ö e m er = ee pe 8 1 
RS-232-NMI-Handlina zkbschliessen 

55286 LDA E73 Wert zus RS-23Z2 Resister fuer aktive MAIS 

“5209 STAA 565539 in Interrupt Control Besıcter <NMI-CIR> vebkertragen 

85212 PLA Reaister wiederherstellen 

85213 TAY 

865214 PLA 

85215 TA%s 

65216 PLA 

85217 RTI 


Timerkanstantentzkelle fuer NTSC 


59218 
65220 
85222 
85224 
835226 
63228 
55230 
535232 
65234 
85236 


53238 
85241 
55243 
65245 
839248 
83250 
835253 
83235 
65259 
635262 
65265 
63267 
85270 
63273 
[bey 
65273 
85281 
85254 


832987 
55298 
65293 
65296 
65239 
55301 
55304 
53306 


65309 : 


55312 
85314 
65317 
53320 
655323 
65325 


563833 
#17 
36391 
573 
363589 
42532 
Sesg2 


Kal, 


Baucd 
Baucd 
Baucd 
Baucd 
Baud 
Baud 
Baucd 
Baud 
Bauıc 
Bzaud 


Part B “NMI-CIR> akfrauen 

Bit a ıRS-232 IND isolieren 

und in Resister fuer empfangenes Bit krinsen 
TimerE fuer DTstenempfang neu anpassen 


Arkeitsmadus fuer TimerE festsetzen und Timer starten 
Wert aus RS3-232 Reqister fuer aktive HMI=s 

im Interrupt Cantrcal Reswister (HMI-CIR> uvekertr=uer 
Latch 


„an TimerB mit Maxzimalwert vorkelemer 


> weiter hei 


TimerE fuer Bzud Rate setzen 


Arkeitszmachis Fuer festsetz =tarten 


Bits 1 und 4 
mit RS-Z32 Feusister 
und wieder 


TimerE ern amd Timer 


fuer altive HMI= 


ahspeicherH 


nerlimnuentfer 


Latch „son TimerB mit Naximalwert vocorbe 


leyen 


Reswister Martlizerge 
in Zaehler fuer Martliserge uekertrager 


281 


CE 5:4 EPErRSIc zZ - - - - - - 


Routine fuer RS-232 Handling 


53332 
53333 
53335 
53338 


[LINE IN En ın 


nn ini 
A A a ra Bl Eu 


TAs 
LOR 
ROL 
TA'Tr 
TARA 
ROC 
STA 
TrRA 
ADC 
sta 
RTS 


NOP 
NOP 
PHP 
PLA 
ARHD 
FHR 


PHR 
TAR 
PHRA 
TYrA 
PHR 
TS% 
LODR 
AND 
BEO 
IMP 
JMP 


552 


280.8 
#16 


583368 


vag) 
7385 


llerte aus Tabelle fuer Baud Rate 
in Werte fuer. die Baud Rste zum Senden umwandeln 
£Rufruf von 625398) 


Rufruf won 63733 


Ststusresister auf Stack legen, 

in Accu bringen 

Bit 4 (“Break Flag? lceschen 

und als Statusresisterinhalt auf Stack legen 


Resister retten 


Processar-Status-Reaister in Rccu bringen 
BRE-Fla3 isolieren 

gesetzt”? Nein: IRQ. weiter hei 65368583 
=63126: Sprung ueker BRK-Vel:tcar 

=39953: Sprung ueker IRQ-Vektor 


Feststellung der TY/-HNHarm und der dau,an =akhaenaigen Taktfreauenz 


ISR 
LOA 
EHE 
LO 
AND 
STR 
IMP 


LOA 
STA 
LDA 
AHL! 
IRA 
STA 
IMP 


u 


> Screen Editor Reset 

Raster Register des Yideco-Chirps 

warten, biz Inhalt des Raster Resisterse = @ 

Raster Count = Latched Fzster Caunt (Raster Compare 


Bit a als Fla93 speichern 
>» Werte fuer Interrupt-Timer festsetzen 


TimerA-IFQ (fuer Tasstzturskbfrzge) freigekhen 


Timer laden und starten (dauernd? 


>= Dlack Qut := hiah 


. 


282 


5532 


IRO>? 


COEBr1 


+ PFHSIc 


ut 


[nd 


Sprunatsbelle fuer KERNAL-Rautinen 


kei 


554099 
559412 
85415 
52418 
at 9er 
55424 
53427 
s243g 
53433 
839436 
55433 
82442 
et tn I ter 
85448 
85451 
ten Zurln 
52427 
te Tat 
85463 
sT4ss 
63452 
Bad’ 
85475 
a4 
559431 


IMP 
IMP 
IMP 
IMP 
IMP 
IMP 
IMP 
’MP 
IMP 
JMP 
JMP 
IMP 
IMP 
IMP 
IMP 
IMP 
IMP 
IMF 
IMP 
IMP 
’MP 
IMP 
J’MP 
’IMP 
JMP 
IMP 


Y JMP 


JMP 
IMP 
IMP 
JMP 
JMP 
IMP 
IMP 
JMP 
IMP 
JMP 
’MP 
IMP 


SE 


65371 
54931 


in ini Ay dh ın 
LED N DON Br N 


50) 


3) 
R.. 


. 
at 


ww 


ıJı 


bu 


3 


Harduare- Interrupt-Veltoren 


zug 


eIz 


aan 


Yektoren Angabe des NHormalwertz keim Einschalten 


chne Erweiterunger) 


Feststellung der TY-Norm (PRL,. NTSC) und Taktfrequenz 
I’O-Reset 

Pruefung auf freien BASIC-RANM-Bereich 

RESTOR: Yektoren initialisieren 

VECTOR: Lesen und Setzen der Vektcrern 

SETMSG: Ausgakemadus setzen 

SECOND: Ausgabe Sekundzeradresse nach LISTEN 

TESRA: ARusaabe Sekundaeradresse nach TALK 
MEMTOP: Lesen und Setzen des Speicherendes 

MEMROT: Lesen und Setzen des Spreicheranfangs 
SCNHEEY: Tastatur akfr age 

SETTMG: Time-Qut-Flaga setzen 

RCPTR: Zeichen vam TEEE-Bus in Accu 

CIOAlT: Aussake Accu zuf IEEE-Bus 

UNTLE: Untzalk auf IEEE-Bus 

UINLSNs: Unlisten auf IEEE-Bus 

LISTEN: zn IEEE-Geraet (Nummer im Accu) 

TALK: an IEEE-Geraet (Nummer im Rccu) 

REROST: 1I0-Status in Accu 

SETLFS: Festsetzung Farameter fuer OPEN 

SETHRAM: Festsetzung Filenzme 

=82232: OPEN: spezifiziertes File ceffner 
=52A97: CLOSE: File Nummer im Accu> schliessen 
=619656: CHEKIN: Fileeirgakevorkerei tung 

=52032: CHEKQOUT: Filesusaakbevorkereitung 

=52259: CLRCHN: aktive Ir’üO-Kanzele schliessen 
=61793: CHRIN: Zeichen vom aktiven I-Kanal in Accu 
=518395: CHROUT: Ausgake Accu auf aktiven QO-kKanal 
LOAD: Load und Verifv van Proarammen 

SRAWYE : Speichern van Programmen 

SETTIM: Uhrzeit setzen (Accu, #R, YR) 

ROTIM: Lhrzeit in Sästel Sekunden in Accu, KR. TR 
=53213: STOP: Akfrase STOP-Taste 

=51”"N3: GETIN: Zeichen von aktivem Einyakekanal halern 
=62225: CLALL: alle Files schliessen 

UDTIM: Uhr um eine Sistel Sekunde weitersetzer 
SCREEN: Lesen des Bildschirmformats (KT) 

PIOT: Lesen und Setzen der Cursöorpasitian (Kr) 
IOBASE: Startadresse der IRQO-CIR nach SKReYR)> 


283 


Adressumrechnung (Betriebssystemlisting) fuer den VIC-20 


der Struktur 
liegt in zwei 
Adressbereich 


Das Betriebssystem des Commodore 64, das 

her mit dem des VIC-20 ziemlich identisch 
getrennten Bloecken zu je acht Kilobytes im 
des Computers. Dies sind die Bereiche von 40960 bis 49151 
sowie 57344 bis 65535. Beim VIC-20 belegt es einen durchge- 
henden Block von 16 KB im Bereich von 49152 bis 65535. Bei 
beiden Geraeten laesst sich das Betriebssystem in zwei Be- 
reiche aufteilen: BASIC und KERNAL. BASIC (der erste Bereich 
von acht KB) enthaelt den BASIC-Interpreter, wohingegen 
KERNAL Routinen zur Abwicklung von 1/0 und anderen hardvare- 
spezifischen Dingen enthaelt. 


von 
ist, 


Betriebs- 
ist, denn 


Aufgrund der aehnlichen Strukturierung der beiden 
systeme (womit ein gleichartiger Aufbau gemeint 

allein durch die unterschiedliche Lage der beiden Betriebs- 
systeme ist ein gleicher Aufbau nicht moeglich) ist es, im 
Gegensatz zu Betriebssystemen von anderen Commodore-Compu- 
tern (wenn man von den CBM 4001 und CBM 8001-Serien absieht, 
da deren Betriebssystem bis auf einen Bereich von 2 Kilo- 
bytes absolut identisch ist) moeglich, fuer den groessten 
Teil der Routinen des Commodore 64 den entsprechenden Be- 
reich des VIC-20 anzugeben. 


nun eine Gegenueberstellung der Betriebssystem- 
Commodore 64 zu denen des VIC-20. Bei den von 
der Struktur her gleichen Teilen wurde der Wert angegeben, 
der den Wert des Commodore 64 in den fuer den VIC-20 richti- 
gen Wert umwandelt. War die Struktur zu unterschiedlich, so 
ist kein entsprechender Wert angegeben. Solche Programmseg- 
mente werden jedoch auch nur aeussert selten aufgerufen. 
Manche Stellen des einen Betriebssystems existieren im ande- 
ren nicht. Auch werden manche Bereiche wohl in kaum einem 
Programm aufgerufen, sodass nur ein Teil der Uebersicht 
praktisch genutzt werden kann, speziell beim Umschreiben von 
Programmen: 


Im folgenden 
bereiche des 


Commodore 64 VIC-20 
40960 - 49148 49152 - 57340 +8192 
49149 - LIJ15l IJMPP Om un... -- -- 
57344 - 57732 57341 - 57729 -3 
57733 - 57734 BNE 57730 - 57731 BEQ 
---- -- -- - - - -- 57732 - 57734 JIMP 
57135 - 57783 57735 - 57783 0 
57784 - 57789 57784 - 57786 
57790 - 58234 57787 - 58231 -3 
58235 - 58245 58471 - 58481 +236 
58246 - 58250 LDX#, JMP 58482 - 58484 JMP 
58251 - 58259 Korrektur ____------------- 
58260 - 58271 58232 - 58243 -28 
58272 - 58273 BNE 58244 - 58246 JMP 
58274 - 58306 58247 - 58279 -27 
Umlegung des USR-Vektors von (0,1,2) nach (784,785,786) 
58307 - 58309 STA 784 58280 - 58281 STA O 
58310 58313 58282 58285 -28 
58314 58319 STA 785 58286 58289 STA ] 

STY 786 STA 2 
58320 58438 58290 58408 -30 
58439 58462 58447 58470 +B 
58463 58540 RESET-Meldung 58409 58446 
58541 58550 Korr. CHKOUT _------------- 
5855] 58585 Fuellcodes 58492 58527 


284 


Commodore 64 


58586 
58592 
58604 
58624 


5859] Zusatz (Screen) 


58603 Test CBM-Key 
58623 RS-232 PAL 


58650 


Startadresse des Bildschirms 


59609 


Umlegung der Adresse (242) nach (677) 


59644 
59647 
59701 
>59704 
59756 
59759 
59768 
59771 
59795 
59798 
59819 
>9822 
59839 
59842 


"direkt" 


59646 
59700 
59703 
59755 
59758 
59767 
59770 
>9794 
59797 
59818 
>59821 
59838 
>9841 
>9844 


steht fuer 


sowie 


16 Farbcodes 


DEC 
INC 
STX 
LDX 
CPX 
CPX 


LDX 


59845 - 59847 JMP 
59848 - 60000 


Bedienung des 


60001 


60002 
60010 


677 
677 
677 
677 
677 
677 


677 


"direkte 


Prozessorports 


LDA 
LDA 


LDA 


STA 


PHA 


1 


l 


l 


58624 - 58650 


in VIC-Chip bringen 


58651 
58678 
58947 
58949 
58971 
58994 
59154 
60763 
59157 
59392 
59413 
59421 


59427 . 


59681 
59689 
59765 


59783 
59785 
59839 
59841 
59893 
59895 
59904 
59906 
59930 
59932 
59953 
59955 
59972 
59974 


58677 
58946 
58948 
58970 
58993 
59153 
59156 
60776 
5939] 
59412 
59420 
59426 
59680 
>9688 
59764 
59782 


>9784 
59838 
>9840 
>9892 
59894 
59903 
59905 
>9929 
>993] 
59952 
>9954 
59971 
59973 
59976 


7277 


NOPSs 


Korr 


NOPSs 


NOPs 


8 Farbcodes 


772 


DEC 


INC 


STX 


LDX 


CPX 


CPX 


LDX 


Ausfuehrung statt 


59971 - 


ektur 


242 


242 


242 


242 


242 


242 


242 


+71 


+139 


+138 
+137 
+136 
+135 
+134 
+133 


+132 


Subroutine" 


59989 direkt 
>59990 - 60142 


(PP) durch Zeropage 


60143 
60146 
60154 
60157 
60165 
60168 
60170 
60175 
60178 


60145 
60153 
60156 
60164 
60167 
60169 
60174 
60177 
60208 


LDA 


LDA 


LDA 


STA 


37151 


37148 


37148 


37148 


+142 


+143 
+144 


+145 


+151 
+157 
+142 
+152 


+151 


Commodore 64 


60123 


PLA 


LDA #6 


Decode/Pointer 


Data fuer VIC 
LSBs (Screen) 
SEI 


SEI 


ASL 


Start Timer 


SEI 
Start Timer 
BMI, BPL 


ASL, BPL 


ASL, BMI 


BIT, BVC 


Zaehlschleife 
NMI sperren 
NMI-Register 


JMP 


direkt 


JSR 


286 


60472 
60486 
60510 
60705 
60777 


NOPs 
NOPs 


NOPs 


22 


LSR 
LSR 
LSR 
LSR 


LSR, 


LSR 


BCS, 


LSR, 
LSR 


LSR, 


LDA, 


Timer 


STA, 


ILL DEV # 


JSR 


LSRO 


BCC 


BCC 


BCS 


BEQ 


RTS 


+149 
+148 
+167 


+171 


+205 
+221 


+24] 


+270 
+267 
+266 
+265 
+266 
+267 
+268B 
+269 
+270 
+262 
+263 
+262 
+254 
+254 
+254 
+254 
+255 
+255 
+255 
+255 
+255 
-255]1 
+232 
+221 
+215 
+216 
+219 


+217 


Commodore 64 


61463 
61476 
61478 
61480 
61491 
61503 
61517 
61538 
61544 
61559 
61565 


61475 


61477 
61479 
61490 
61502 
61516 
61537 
61543 
61558 
61564 
61573 


LDA 1 


Timer 


58 


Belegung von Bit 3 im RS-232 


61574 
61577 
61585 


61590 


61596 
61601 
61622 
61627 


61576 
61584 
61589 
61595 
61600 
61621 
61626 
61886 


LDA 

AND#, STA 

ORA#, STA 

LDA#, STA 

LSR 

BCC 

LDA 158 

JMP 

JSR 

SEC 
sovie 

CLEAR ST 

JMP 

JISR 

sowie 

Korrektur 

Init RS-232 
sovie 
sowie 

LSR, BCS 

LSR, BCS 


Update RUNSTOP 


CMP#, BEQ 


PHA 


PLA 


direkt 


direkt 


Korrektur 


direkt 
direkt 


Korrektur 


Korrektur 
CMP#, BNE 


CMP#, BNE 


+214 
+212 
+207 
+201 
+200 


+201 


+198 
+193 
+188 
+183 
+176 
+179 
+180 
+178 
+177 
+182 
+1B5 


+197 
+192 
+188 
+202 


+191 


+164 
+162 


+151 
+152 
+153 


+131 


Commodore 64 


63329 
63335 
63534 
63544 


63334 
63533 
63543 
63612 
63625 


Test CBM-Key 
PP 

Timer Init 
BLANK SCREEN 


PP 


Zusatz 


Zusatz 


Zusatz 
BMI, JMP 
Zusatz 


Start Timer 
PP 


SAVE 332767 


UNBLANK SCREEN 


PP 

RESET VIC-II 

Absolute 

RAM-Test &c. 
sovie 

I/O-Reset 

PHA 


PLA 


Test RESTORE 


sowie 


Zusatz (Tape) 


288 


STA 


Update Time 


CLEAR IFR 


BPL 


Zeropage 


CLEAR IFR 


+125 
+127 
+114 
+106 
+110 
+113 
+123 


+98 
+98 


+87 
+90 
+83 
+80 
+77 


+68 


+62 
+60 
+52 
+62 
+64 
+61 


+60 


+8B6 
+80 


+79 


+102 
+105 


+108 


+42 


Commodore 64 


65371 
65408 
65409 
65418 
65526 
65530 


65407 PAL/NTSC-Test 
Fuellcodes 

65417 Vektoren 

65525 

65529 Fuellcodes 

65535 


289 


SYSTEMROUTINEN 


Das Betriebssystem des Commodore 64 enthaelt im Bereich von 
65409 bis 65525 eine Sprungtabelle, anhand derer elementare 
Routinen fuer eigene Programme angesprochen werden koennen. 
Diese Sprungtabelle wird auch vom Betriebssystem selbst ge-. 
nutzt, wodurch es einfach wird, neue Funktionen zu implemen- 
tieren, da einige JMP's der Tabelle indirekte Spruenge ueber 
Vektoren sind. 


Diese Sprungtabelle ist, von den ersten drei Eintragungen 
abgesehen, auch im VIC-20 implementiert, so dass Routinen- 
aufrufe in Maschinenprogrammen, die fuer den VIC-20 ge- 
schrieben sind, im Normalfall nicht geaendert werden mues- 
sen, falls sie ueber die Sprungtabelle ablaufen. 


Auch die anderen Serien von Commodore (PET, CBMs) haben eine 
Sprungtabelle am Ende des Betriebssystems, die jedoch nur 
zum Teil mit der des Commodore 64 identisch ist, so dass ei- 
ne Programmaenderung wohl meist unerlaesslich sein wird. 


Handhabung der Systemroutinen: 


Die Systemroutinen sind so ausgelegt, dass nach Aufruf der 
Routine Fehler abgefangen werden koennen (sofern ueberhaupt 
welche auftreten koennen). Es kommt daher nicht zum Abbruch 
des Programms durch eine Fehlermeldung, sondern es erfolgt 
eine Rueckkehr zur aufrufenden Routine. Das Auftreten eines 
Fehlers wird durch eine Rueckkehr mit gesetztem Carry ge- 
kennzeichnet. In diesem Fall enthaelt der Accu die Nummer 
des Fehlers, der dann durch das Programm behandelt werden 
kann. 

Einige Routinen benvetigen auch Informationen, die durch an- 
dere Routinenaufrufe gegeben worden sein muessen (Vorberei- 
tungsroutinen), da sonst die Moeglichkeit besteht, dass die 
Routine nicht erwartungsgemaess funktioniert. 


Bedeutungen der Fehlernummern: 
Fehlernummer bei gesetztem Carry im Accu: 


0: BREAK 
gedrueckte RUNSTOP-Taste waehrend des Programmablaufs 
1: TOO MANY FILES 
die maximale Anzahl an offenen Files betraegt zehn 
2: FILE OPEN 
jeder Fileeintrag muss eine andere Filenummer haben 
3: FILE NOT OPEN 
jedes File muss vor Zugriff geoeffnet werden 
4: FILE NOT FOUND 
das gesuchte File ist nicht verfuegbar 
5: DEVICE NOT PRESENT 
das angesprochene Geraet reagiert nicht auf Adressierung 
6: NOT INPUT FILE 
aus Schreibfiles kann nicht. gelesen verden 
72: NOT OUTPUT FILE 
in Lesefiles kann nicht geschrieben verden 
8: MISSING FILE NAME 
bei LOAD und SAVE (serieller Bus) ist ein Filename noetig 
9: ILLEGAL DEVICE NUMBER 
versuchtes Kommando ist bei diesem Geraet nicht moeglich 


290 


Eine Fehlermeldung selbst wird nicht ausgegeben; dies muss, 
sofern erwuenscht, vom Hauptprogramm aus durchgefuehrt wver- 
den. Es ist jedoch durch den Aufruf der Routine SETMSG (sie- 
he Beschreibung) moeglich, die Ausgabe einer Fehlermeldung 
zu erreichen, die dann lautet "I/DO.ERROR #?", die jedoch zu 
keinem Programmabbruch fuehrt. Die Fehlerausgaberoutine be- 
ginnt ab Adresse 63227, hat jedoch mehrere Einsprungstellen. 


Routinenbeschreibung: 
65409: Feststellung der Fernsehnorm (PAL/NTSC) 


Aufgrund der unterschiedlichen Fernsehnormen besitzt 
der Commodore 64 je nach Fabrikation einen Quarz ent- 
weder fuer PAL oder NTSC. Aus der Frequenz dieses 
Quarzes werden dann andere benoetigte Frequenzen ge- 
neriert. So auch die normale Taktfrequenz von unge- 
faehr einem MHz. 


Der Quarz hat folgenden Wert: PAL: 17.734472 MHz 
NTSC: 14.31818 MHz 


Die Taktfrequenz fuer die CPU und alle anderen davon 
abhaengigen Bausteine errechnet sich aus der Quarz- 
frequenz durch Division durch 18 (PAL) beziehungsvei- 
se 14 (NTSC). Daraus ergibt sich, dass der europae- 
ische Commodore 64 etwas langsamer als der amerika- 
nische ist. Im normalen BASIC sind diese Unterschiede 
unbedeutend, bei Datenuebertragungen der RS-232- 
Schnittstelle muessen jedoch diese unterschiedlichen 
Taktfrequenzen beachtet werden. Auch die Initialisie- 
rung fuer den Interrupt muss diesen Unterschied be- 
achten, da die interne Uhr genau alle 60stel Sekunden 
veitergestellt werden muss. 


Diese Routine setzt in Adresse 678 eine von der Fre- 
quenz abhaengige Flag und setzt automatisch auch den 
Timer fuer den Interrupt zur Tastaturabfrage neu 
fest. Ausserdem wird ein Screen-Editor-Reset ausge- 
fuehrt. 


Die Adresse 678 hat folgenden Inhalt: PAL: |] 
NTSC: 0 


65412: 1/O-RESET 
Beide CIAs sowie der interne I1/O-Port der 6510 werden 
initialisiert. Ausserdem wird der TimerA der IRQ-CIA 
mit dem fuer den normalen Tastaturabfrage-Interrupt 
notwendigen Wert initialisiert (siehe 65409). 

65415: Pruefung auf freien BASIC-RAM-Bereich 
Diese Routine prueft, bis zu welcher Adresse fuer 
BASIC verwendbares RAM vorhanden ist und setzt die 
Pointer fuer MEMBOT und MEMTOP 

65418: RESTOR 


Ruecksetzung der Sprungvektoren im Bereich von 788 
bis 819 auf die Normalwerte. 


291 


65421: 


65424: 


65427: 


65430: 


VECTOR 
Parameter: XR, YR, Carry 


Bei gesetztem Carry wird der Sprungvektorbereich 
(788,...,819) in den Bereich uebertragen, auf den das 


‚Registerpaar (XR/YR) zeigt. Dort kann die Sprungta- 


belle dann modifiziert werden. Das Rueckschreiben in 
den Bereich der Vektortabelle erfolgt mit geloeschtem 
Carry und der Startadresse der modifizierten Vektor- 
tabelle in (XR/YR). 


SETMSG 
Parameter: Accu 


Die hauptsaechliche Routine besteht im Prinzip fast 
nur aus dem Befehl 'STA 157'. Doch sollte normaler- 
weise diese Routine aufgerufen werden, da die Adresse 
157 in anderen Versionen des Betriebssystems eine an- 
dere Aufgabe haben koennte. Die Adresse 157 hat zwei 
Bedeutungen, die in den Bits 6 und 7 festgelegt wer- 
den. Bit 7 gibt an, ob Meldungen wie "SEARCHING" aus- 
gegeben werden sollen. Ist Bit 7 gesetzt (ist im Di- 
rektmodus der Fall), so werden die Meldungen ausgege- 
Ben, ansonsten unterdrueckt. Ist Bit 6 gesetzt, so 
verden auch die I1/0-Errors ausgegeben. Wird eine Rou- 
tine angesprungen, bei der Fehlermoeglichkeiten be- 
stehen, so wird, falls ein fehler auftritt, die Mel- 
dung "1/0 ERROR #?" mit der entsprechenden Nummer 
ausgegeben, das Programm jedoch nicht abgebrochen. 
Der Accu enthaelt nach Aufruf der Routine den Wert 
der Statusvariablen fuer Recorder und seriellen Bus. 


SECOND 

Parameter: Accu 

Vorbereitungsroutinen: LISTEN 

moegliche Fehler: siehe READST (65463) 

Ausgabe der Sekundaeradresse (im Accu) auf den seri- 
ellen Bus nach LISTEN. Fuer die Ausgabe der Sekun- 
daeradresse nach TALK kann diese Routine nicht be- 
nutzt werden. 

TKSA 

Parameter: Accu 

Vorbereitungsroutinen: TALK 

moegliche Fehler: siehe READST (65463) 

Ausgabe der Sekundaeradresse (im Accu) auf den seri- 
ellen Bus nach TALK. Fuer die Ausgabe der 


Sekundaeradresse nach LISTEN kann diese Routine nicht 
benutzt werden. 


292 


65433: 


65436: 


65439: 


65442: 


65445: 


MEMTOP 
Parameter: XR, YR, Carry 


Bei gesetztem Carry wird die Adresse der hoechsten 
verfuegbaren RAM-Adresse in das Registerpaar (XR/YR) 
uebertragen, bei geloeschtem Carry wird (XR/YR) in 
den Pointer auf die hoechste RAM-Adresse geschrieben. 


MEMBOT 
Parameter: XR, YR, Carry 


Vebergabe der BASIC-RAM-Startadresse (im Normalfall 
2048) in (XR/YR) bei gesetztem Carry und Uebertragung 
von (XR/YR) in den Pointer auf den Anfang des BASIC- 
RAMs bei geloeschtem Carry. 


SCNKEY 


Abfrage der Tastatur wie durch das normale Interrupt- 
Handling auch. Bei gedrueckter Taste wird der ASCII 
der Taste im Tastaturpuffer abgelegt. Der Aufruf die- 
ser Routine ist notwendig, falls bei gesperrtem IRQ 
trotzdem Tastendruecke erkannt werden sollen. 


SETTMO 
Parameter: Accu 


Diese Routine dient zur Handhabung des Timeouts fuer 
den seriellen Bus und setzt eine Flag, die im Falle 
eines Timeouts abgefragt wird, so dass die Moeglich- 
keit besteht, einen weiteren Versuch zu machen, auf 
den seriellen Bus zuzugreifen. Allerdings wird die 
Flag im gesamten Betriebssystem nicht genutzt, so 
dass diese Routine keinen Sinn hat. Es besteht also 
keine Moeglichkeit (ausser, wenn dies durch das eige- 
ne Programm realisiert wird), den Computer ein Time- 
out uebersehen zu lassen (im Gegensatz zu den CBMs). 


ACPTR 

Parameter: Accu 

Vorbereitungsroutinen: TALK (, TKSA) 

moegliche Fehler: siehe READST (65463) 

Diese Routine holt ein Byte vom seriellen Bus in den 


Accu. Das Geraet muss zuvor mittels TALK (und evtl. 
TKSA) angesprochen worden sein. 


293 


65448: 


65451: 


65454: 


65457: 


65460: 


65463: 


CIOUT 

Parameter: Accu 

Vorbereitungsroutinen: LISTEN (, SECOND) 
moegliche Fehler: siehe READST (65463) 


Diese Routine gibt den Inhalt des Accumulators auf 
den seriellen Bus aus Wird das Byte nicht empfangen, 
so wird ein Timeout gegeben. Ein Byte wird durch die- 
se Routine immer in einem Zwischenpuffer (149) gehal- 
ten, um im Falle eines UNLSNs dieses Byte zusammen 
mit der EOI-Kennzeichnung ausgeben zu koennen. 


UNTLK 
moegliche Fehler: siehe READST (65463) 


Senden eines Untalks ueber den seriellen Bus an den 
momentanen Talker. 


UNLSN 
moegliche Fehler: siehe READST (65463) 


Senden eines Unlistens ueber den seriellen Bus an den 
momentanen Listener. 


LISTEN 
Parameter: Accu 
moegliche Fehler: siehe READST (65463) 


An das Geraet, dessen Geraetenummer sich im Accu be- 
findet, wird ein LISTEN ausgegeben. Attention bleibt 
nach Rueckkehr aktiv und wird erst nach Ausgabe der 
Sekundaeradresse (SECOND) rueckgesetzt. 


TALK 
Parameter: Accu 
moegliche Fehler: siehe READST (65463) 


An das Geraet, dessen Geraetenummer sich im Accu be- 
findet, wird ein TALK ausgegeben. Attention bleibt 
nach Rueckkehr aktiv und wird erst nach Ausgabe der 
Sekundaeradresse (TKSA) rueckgesetzt. 


READST 
Parameter: Accu 


Nach Aufruf dieser Routine enthaelt der Accu den mo- 
mentanen Wert der Statusvariablen. Ist der Inhalt des 
Registers fuer die Geraetenummer (186) gleich zwei, 
so wird der RS-232-Status in den Accu uebertragen, 
wobei das RS-232-Statusbyte danach durch Belegen mit 
dem Wert null geloescht wird. Fuer eine zweite Abfra- 
ge desselben Werts kann also nicht diese Routine auf- 
gerufen werden. Die Bedeutung des RS-232-Statusworts 
ist der Erklaerung des RS-232-Handlings zu entnehmen. 
Der Aufruf dieser Routine erfolgt normalerweise nach 
Eroeffnung eines neuen Kanals. 


294 


Die Bedeutungen der Statusbits (Bus und Tape) 


I ST I Bit- I Recorder I serieller Bus I 
I Bit I Wert I (nur Read) I (Read und Write) I 
Io 1l 11 - I Zeitfehler, Wrt I 
Iı 71 2 1 - I Zeitfehler, Rd, Wrt I 
I 2 1 4 I zu kurzer Block I - I 
I 3 1 8 I zu langer Block I - I 
I4a 1 16 I Lesefehler I - I 
I -5° 1] 32 I Pruefsummenfehler | - I 
I6 1 64 I Fileende (EOF) I Vebertragungsende/EOI I 
I 7 1 1281 - I Geraet reagiert nicht I 


EOF tritt nur im Zusammenhang mit Files auf. Bei VER- 
IFY zeigt Bit 4 ausserdem Nichtuebereinstimmungen an. 


65466: SETLFS 
Parameter: Accu, XR, YR 


Festsetzung der Filenummer (Accu), Geraetenummer (XR) 
und der Sekundaeradresse (YR). Diese Routine muss vor 
Eroeffnung eines files aufgerufen werden. Die Gerae- 
tenummern haben folgende Bedeutungen: 


Tastatur 
Recorder 
RS-232-Kanal 
Bildschirm 


UDO 


Geraetenummern ab 4 sprechen den seriellen Bus an. 
Dabei ist die Nummer vier meist dem Drucker vorbehal- 
ten wohingegen die Nummer acht im Normalfall fuer 
Diskettenstationen vorgesehen ist. 


65469: SETNAM 
Parameter: Accu, XR, YR 


Diese Routine legt die Daten fuer den Filenamen eines 
Files fest und muss vor Eroeffnung eines files aufge- 
rufen werden. Ist die Angabe eines Filenamens nicht 
erwuenscht, so muss als Laenge des Filenamens der 
Wert null verwendet werden. Die Laenge des Filenamens 
wird im Accu festgelegt, die Startadresse wird durch 
das Registerpaar (XR/YR) festgelegt (niederwertiges 
Byte im XR, hoeherwertiges Byte im YR). 


65472: OPEN 
Vorbereitungsroutinen: SETLFS, SETNAM 


moegliche Fehler: O0 (nur Tape), 1], 
(falls File# = 0) 


Der Aufruf dieser Routine bewirkt das Eroeffnen eines 
logischen Files mit den durch SETLFS und SETNAM gege- 
benen Parametern und die Eintragung dieses Files ın 
die. Tabelle der Fileparameter. 


295: 


65475: 


65478: 


65481: 


65484: 


CLOSE 
Parameter: Accu 
moegliche Fehler: O (Tape Write) 


Ordnungsgemaesses Schliessen des files mit der im Acr 
cu befindlichen Nummer und Loeschen des Eintrags in 
der Filetabelle. 


CHKIN 

Parameter: XR 

Vorbereitungsroutinen: OPEN 

moegliche Fehler: O0 (Tape Read), 3, 5, 6 


Vor Zugriff auf ein durch OPEN eroeffnetes File durch 
GETIN oder CHRIN (eine Ausnahme bildet die Tastatur, 
die nicht durch CHKIN aktiviert werden muss) muss 
diese Routine aufgerufen werden. Sie aktiviert das 
mit der Filenummer (im XR) verbundene Geraet zum Zu- 
griff in dieses File. Ist die Geraetenummer groesser 
als 3, so wird ein TALK mit anschliessender Ausgabe 
der Sekundaeradresse durchgefuehrt. 


CHKOUT 

Parameter: XR 

Vorbereitungsroutinen: OPEN 

moegliche Fehler: O (Tape Write), 3, 5, 7 


Sollen Daten auf ein zuvor durch OPEN eroeffnetes 
File durch CHROUT ausgegeben werden (Ausgaben auf den 
Bildschirm koennen direkt erfolgen), so ist der Auf- 
ruf dieser Routine notwendig. Sie bereitet das Ge- 
raet, dessen fFilenummer im XR angegeben wird, auf 
Ausgaben in dieses file.vor. Ist . die Geraetenummer 
groesser als 3, so wird ein LISTEN mit anschliessen- 
der Ausgabe der Sekundaeradresse durchgefuehrt. 


CLRCHN 


Nach Ausgabe oder Empfang von Daten auf oder von 
Files wird diese Routine benutzt, um alle offenen Ka- 
naele zu schliessen (UNTLK und UNLSN) und die Stan- 
dardwerte zu setzen (Eingabe von Tastatur, Ausgabe 
auf Bildschirm). Wird diese Routine nach Aktivierung 
nicht aufgerufen, so koennen mehrere Geraete aktiv am 
I/0O-Bus bleiben und so zum Beispiel die Ausgabe von 
Diskettendaten direkt auf Drucker erfolgen. 


296 


65487: 


65490: 


65493: 


65496: 


CHRIN 
Parameter: Accu 


Der Aufruf dieser Routine bewirkt das Holen eines 
Zeichen aus dem durch CHKIN aktivierten File oder, 
falls kein CHKIN erfolgt ist, von der Tastatur. Das 
geholte Zeichen befindet sich im Accu. Der Kanal zu 
diesem File bleibt geoeffnet. Sollen Daten von der 
Tastatur geholt werden, so wird der Cursor eiınge- 
schaltet und so lange gewartet, bis die RETURN-Taste 
gedrueckt wird. Bei jedem Aufruf dieser Routine wird 
dann jeweils ein Zeichen geholt. Ist das letzte Zei- 
chen gelesen worden, so wird der Code 13 geschickt. 
Bei weiteren Aufrufen beginnt der Vorgang von vorne. 


CHROUT 
Parameter: Accu 


Ausgabe eines Zeichens (im Accu) auf den aktiven Aus- 
gabekanal. Wird durch CHKOUT kein Ausgabekanal fest- 
gelegt, so erfolgt die Ausgabe auf den Bildschirm. 
Der Kanal bleibt nach Ausgabe des Zeichens geoeffnet. 


LOAD 

Daraeter: Accu, XR, YR 
Vorbereitungsroutinen: SETLFS, SETNAM 
moegliche Fehler: 0, 4, 5, 8 (nur Bus), 9 


Der Accu enthaelt die Flag fuer LOAD (0) und VERIFY 
(1). (XR/YR) gibt die Startadresse an, ab der das 
Programm abgelegt beziehungsveise verglichen werden 
soll (nur fuer Sekundaeradresse ungleich null). Wird 
als Sekundaeradresse null spezifiziert, so wird das 
Programm an die Stelle geladen, ab der es gespei- 
chert worden ist. Bei der Rueckkehr enthaelt (XR/YR) 
die Endadresse plus eins des geladenen oder vergli- 
chenen Programms. Ein Filename muss beim Laden von 
Recorder nicht spezifiziert werden. 


SAVE 

Parameter: Accu, XR, YR 
Vorbereitungsroutinen: SETLFS, SETNAM 
moegliche Fehler: 0, 5, 8 (nur Bus), 9 


Der Accu gibt den Pointer auf die Startadresse des 
Programms an. Soll ab Anfang des BASIC-Bereichs ge- 
speichert werden, so muss der Accu den Wert 43 ent- 
halten, da der Pointer (43/44) auf den Anfang des 
BASIC-Programms zeigt. Das Registerpaar (XR/YR) ent- 
haelt die Endadresse des zu speichernden Programms. 
Die Angabe eines Filenamens ist bei Ausgabe auf Re- 
corder nicht notwendig. 


297 


65499: 


65502: 


65505: 


65508: 


65511: 


65514: 


65517: 


SETTIM 
Parameter: Accu, XR, YR 


Diese Routine setzt die interne Uhr auf den in den 
Registern festgesetzten Wert neu fest. Der Wert muss 
in 60stel Sekunden angegeben werden, wobei der Accu 
das hoechstwertigste und das YR das niedervwertigste 
Byte enthaelt. 


RDTIM 
Parameter: Accu, XR, YR 


Das Lesen der internen Uhr erfolgt durch Aufruf die- 
ser Routine. Die Register enthalten dann die Uhrzeit 
in 60stel Sekunden, wobei der Accu das hoechstvertig- 
ste und das YR das niederwertigste Byte enthaelt. 


STOP 
Parameter: Zeroflag 


Ist bei Aufruf dieser Routine die RUNSTOP-Taste ge- 
drueckt, so wird die Zeroflag gesetzt. Der Zustand 
der uebrigen Flags bleibt unveraendert. Bei gedrueck- 
ter RUNSTOP-Taste wird ausserdem ein.CLRCHN 'durchge- 
fuehrt. 


GETIN 
Parameter: Accu 


GETIN ist identisch mit CHRIN, mit dem Unterschied, 
dass, wird ein Zeichen von der Tastatur gelesen, di- 
rekt aus dem Tastaturpuffer gelesen und nicht auf die 
Eingabe eines Zeichen gewartet wird. Ist der Tasta- 
turpuffer leer, so wird dem Accu der Wert null ueber- 
geben. Der Tastaturpuffer wird durch SCNKEY gefuellt, 
was normalerweise durch die normale Interruptroutine 
geschieht. 


CLALL 


Diese Routine setzt den Zaehler fuer die Anzahl offe- 
ner Files auf null zurueck und fuehrt anschliessend 
ein CLRCHN aus. Es erfolgt kein ordnungsgemaesses 
Schliessen noch offener Dateien! 


UDTIM 


Im Normalfall wird diese Routine von der normalen In- 
terruptroutine aufgerufen. Sie erhoeht die interne 
Uhr um eine 60stel Sekunde. Ausserdem wird das Regi- 
ster fuer die RUNSTOP-Abfrage (Flag fuer diverse Tas- 
ten) auf den aktuellen Stand gebracht, um die 
RUNSTOP-Funktion aufrecht zu erhalten. 


SCREEN 
Parameter: XR, YR 
Nach Aufruf dieser Routine enthaelt das XR die Anzahl 


Spalten (40) und das YR die Anzahl Zeilen (25) des 
Bildschirms. 


298 


65520: 


65523: 


PLOT 
Parameter: XR, YR, Carry 


Bei gesetztem Carry enthaelt das XR die aktuelle Cur- 
sorzeile (0 bis 24) sowie das YR die aktuelle Cursor- 
spalte (0 bis 79). Bei geloeschtem Carry werden die 
Cursorzeile und -spalte entsprechend den Inhalten von 
XR und YR gesetzt. Ausserdem werden die zugehoerigen 
Zeilenparameter aktualisiert. 


IOBASE 

Parameter: XR, YR 

Diese Routine uebergibt in (XR/YR) die Startadresse 
des I/O-Bereichs, beim Commodore 64 ist dies die 
Startadresse der IRQ-CIA. Die Registerfolge und die 


Registerbedeutung haengt vom 1/0-Baustein ab und ist 
daher beim VIC-20 und C=64 unterschiedlich. 


299 


STICHWORTVERZEICHNIS 


Abkuerzungen der BASIC-Befehle ......... ERSTEN TORTE FTN 9 
ABSolutprogramn ss. ar ante ie en 108 
BECUMUFALOT. reisen a Brendan ee 222 
AUCPTR, Systemroutine ss... nein 84, 293 
Adaption von CBM-Programmen ......... ee we 43, 115 
Adresse zus eneee FE U TOO EEE 11, 26, 27 
Adresszerlegung 4,4204 2u 422 2 ee 32,33 
AdTESSFOTMaT: 252220: a I I 7 
Adressierungsartten 2:44, Re a u 33, 39 
Adressumrechnung fuer den VICE 20 ...2.vsceerereereenee 284 ff 
ADSR=-FURKE LION ran aa ann Hin Sad 73, 77 
AUD-Wandler zu: an a EEE A ee . 78 
RlarmzerE za un NE nn u nee an 94 
Amplitude - siehe Huellkurve 

"AND"=Verknuepfung u, a een u 
Anhaengen von BASIC-Programmen (APPEND) ....ccceererernse 108 
AREUS=SINUS sms sea a ae 21-022 


ARG, floatingpoint ARGument - siehe Fliesskommaaccus 
Arithmetik, binaere - siehe Binaerarithmetik 
Ari ehmetik, interne - siehe USR 


ALTaY- nee ee Re EEE WE RE DEE EEE 18 
ALTAYNEeader sauce en ernannt 18 
Assembler/Disassenbler z...42uuu: ws @ 22.200004 EL 34 - 36 
ATTACK #354... ir 73, 74 
Ausgaberegister - siehe Port 

BANDPASS asia een Keane 77 
Banking, Kontroölleitüngen ss... 4 0 re ae, 26 
Banking, ‚PToOZzessor wu, u. eier 43, 126 
Banking, en EUREN UDER EN een AL = Ad: 49 
BASIC-ROM su 3 20 au u nano rundet ee ZB 
Baudrate (RS- 232). - siehe Uebertragungsrate 

BCD-Format, gepacktes .....sseceeeeeneee seen, 13 1945,98 
Befehlsliste der BASIC-Befehle ......v.ccroreee LEN. ET; 
Befehlsliste der 6502-Befehle ........ceeeeereee.e a DI 38 
Betfehlswort. 4.4.0 2.0004 See De a we re Bere . 26 
Betriebssystem rs... un Kar ne a ee 7, 26, 43 
81.19S5ch1TME8de var reine ER 44 - 46 
Bilaschirmspeicher er... 3. aan 4], 42, 46, 50, 54 
Bildschirm, Verschieben des - siehe Scrolling 
Binseraricthmetik,. usa, isn rerutnıe 10 
Binaerarithmetik, vorzeichenlose .......... EEE 10, 11 
Binaerarithmetik, vorzeichenbehaftete .......c.sccrererese 13 
BIENBeTrexXpoment esse a a are 15 
Binsersysten „su. un. Een er sandte 10, 14 
BIT wasser ee ir eier 10, 25 
BITS,. Setzen Von) sun eu RR TB nt 10, 12 
BITSy !Loeschen Von Sasse ierarsheen 10, 12 


Bit Map Modus - siehe HIRES 
Blanking des Bildschirms - siehe SCREEN BLANKING 


BYE EEE er a re We ae ee A ee ra 11, 25 
BARLY ee EEE AI Deere here 30 
kassettenpuffer ass aaa er 63, 106 f 
Eassettenrecorder sure ri a een 106 
Cassettenspeicherung, Aufbau ......c.00. ee een 106 


CBM-Programme, Umsetzung von - siehe Adaption 
Character Generator - siehe Zeichengenerator 


ECHAREN u sen a era r de 43, 125, 129 
BHRGETSPOINTET 2 ein ae ran 111 
ECHKRIN, Systenrobtine 2. ra se ee 29 
EHKDUT,  -Systenroutine es ir rs ee des 295 
EHRIN;- SySstemröutine: sus. ern . 297 
CHRDUTSZ Systenroöutine 2,4: 334u 2 . 297 
CHR$ - siehe Steuercodes 

EIR, una rue ae 20, 91 ff 


EIA,. Interrüpthandling 22,420 04, 8223304 EEE EN 95 


ETAS Serieller Port nm sein 92 
CIA, Timer „...soeeoeeeeeeee een een nun 92 
CIA, Verwendung der CIAs im 64er „oo: eeceeeeeneennneenn ne 98 
EIOUT,- Systemroutine un... ea 83, 294 
ELALL, Systenröutine u... a Res ee 298 
CEDSE,..RS>232. using ee ee 86 
CLOSE, Systemroutine ....... en Se ea ee 295 
CLRCHN, Systemroutine ....eeeeeeeeeereneeeeeee ernennen ne 295 


Collisions - siehe Kollisionen 
Color-RAM - siehe Farbspeicher 
Colorregister - siehe Farbregister 
Color-Nybble-RAM - siehe Farbspeicher 


Compare, Maschinenspräache ss. es, 1. a a 29 
CPU 2432324 a a a en ee Benin 125 
EUTSOT Susan nern El Brarhsireden 60, 299 
Data Direction Register - Eiche Datenrichtungsregister 
DATA-Zeilen .....cscrc00.. 7, 22, 45, 48, 56, 653, 64, 72, 130 
Dateitypen «sr... EEE ERTETUEITESTEREEIRUR 107, 109 
Datenrichtungsregister .....ccr0r00: ee DREI 4], 91 
Datenwortlaenge ERS=232) 22230 na u ure 86, 87 
DECAY u. een ea I 73, 74 
DEFFN, Einschraenkungen .....cccr.0.. ee nee 111 
DEFFN, Ablage: des Eintrags sus es. sr a ee 17 
Devicenumber - siehe Geraetenummer 

Dezimalsysten. 2.02. nad 10 
DIM sarah Taerar 19 
Dimensionierung een Bee ea 18 
Directory z.4..4%0.% a Be Eee ea B4 
Direktmodus ....scceeseree ee ee ee ee 7 
Diskette „544 sungen EEE ee ae 110 


Diskette, Anfangsadresse eines Programms ......ee.eceee.. 111 
Disketteninhaltsverzeichnis - siehe Directory 

BRETEEK.,- Wellenfoörn +... 2 es. a rin 74, 76 
Dual... - siehe Binaer... 

Echtzeituhr - siehe TIME OF DAY 

Ein/Ausgabe siehe CIA und Prozessorport 

Einblenden des Zeichengenerators, siehe Zeichengenerator 


Eingsbepuffer,: BASICH zn ein nn 7 
Einserkömplenent. 532,443 Hr 14 
Einzelpunktmodus - siehe HIRES 

Einzelzeilenregister „,...uuu ur, a aan 61 - 63 


Entwurfsblatt, Sprite- - siehe Sprites 
Envelope-Generator - siehe Huellkurve 


EOT, EndDOf Tape ar a 109 
EXROM 220 rer rare ns 125 
Extended Background Color Mode ........2ereeereereree 46, 47 
externes Signal (SID, Filter) us sau a ae 77 
FAC, Floatingpoint ACcumulator - siehe Fliesskommaakkus 

FArbpointer ss ende 46, 47, 52, 57 


Farbquelle - siehe Farbpointer 
Farb-RAM - siehe Farbspeicher 


Farbregister Tasse near 53, 57, 67 
Farbspeicher sure 43, 45, 47, 48, 50, 52, 63 
Faärbbabelle. 1u422 2325222 sFr einen 67 
Kenlerkorrektur 2,2, in seaateen 106 
rehlermeldungeny. ID zu... 222 ae 290 
Feld - siehe Array 

Ferdeinfträg 2250er 19 
keldlaengenberechnung: 4... uw su. 2 a 19 
Fernsehnorm: PALZNTSE 2023 3 25 een 59, 125, 29] 
FI lehändling rss, ee nn 83, 109 
Filter ses ae er een 76 
Filterkömbination 2432,22. A a a 77 
Fläckern,. Vermeidung. ss 0a. 59, 62, 63 
FI3Q 22. ann aaa aha essen har 11 


Fliesskommazahlen, Darstellung ....oee2ceeeeessereenen ne 15 f 


Fliesskommaakkumulatoren ......o.2eeereerereeen ee 165.205» 21 
Floppy Disc - siehe Diskette 

FORCE: LOAD 30:8 RE EN EEE 93 
Frequenzberechnung ...... EEE EEE 73 
Funktionen, BASIC- ....22eeeeeeeern nn ar a a Wan arg ee 20 
Funktionen, mathematische ......c2cceeeren nern ner ne 20, 21 
Funktionen, selbstdefinierte - siehe DEFFN und USR 
Funktionen, "StELINgS nor irn 20, 22 
Funktionstasten „uss.022.4. ui 23,.71,.72 
GARBAGE. EDELFFET ua near ee 18 
GAME nu 244 IE yank erg 125 
GATE=-BIE 222er 76, 77 
gepacktes BCD-Format - siehe BCD-Format 

Geraetenummer .„.......:... EEE ENTE EEE 83, 86 
GETIN,: SYSEENTOUL ine 444 urn 298 
Graphikmodus - siehe HIRES 

Halbduplex (RS-232) ....2eeeeeeenn. ee Re Der 87 
Header you en een ehetsieeens 106 f 
Hexädezimal suisse Renee ande I 3 
Hintergrund (Funktion) ..2..ssoooecoceneess sense. 47, 92;:97 
Hintergotundfarbe zn. are 4, 48, 50, 53 
Hintergrundfarbe, Modus fuer erweiterte - siehe Extended 
HILGHPASS ae. 32er ee LO 
HERAM Au er era ererusnanlseeenaenest 125, 126 
HIRES usa 2553 rare ernserknen 49 - 52 
HIRES-Datenablage unter ROM ....orceeereeeeeeeenerenenen 130 
Hielikurve vn ar are 74, 77 
IEEE=4BB nassen riet 83, 86 
IEC-Bus - siehe IEEE-488 

Insertmodus ...... ERLEBEN REN WERTET TEUERSTE N 7] 


Integer „2:00 ne ne nennen 17, 20 
Interne Codierung v von BASIC-Programmen ....ssseeeeeeeee 7, B 
Interpretercodes - siehe TOKENS 


Interrupt - siehe auch IRQ und NMI ......zcecer0.. 58, 59, 71 
Interruptqauellen zus. 2 2 ee 59, 95 
Intervalltimer - siehe CIA, Timer 

IOBASE, Systemroutine ....... Keen EU 299 
I/0O-Bausteine - siehe CIA 

TI D=-Bereich zur 2 a Di ea ed 43, 117 
IRO: was sera au aernt 43, 59, 98 
IRQ-CIA - siehe auch CIA .......cere00. 60, 98, 99, 103 - 105 
IRO=Enable; „ira ia an irn OPT 59 
IRO=SFLl&gs: ..,2u 302045 HE RE ea 99500 
IRQ=Masken 3, 2.3.4. 0 2 rer ern 59 
IRQ, Sperren des: vu 422.3u 2 a ie 453, 44, 102 
JOYSELCKE- 2 rn een een 101 f 
Kassette... - siehe Cassette... 

KERNAU=ROM 555: a ri essen 128 


KEY-Bit - siehe GATE-Bit 
Kollisionen von Sprites - siehe Sprites, Kollisionen 


Komplenent sus sure era ener 14 
KontroLlparts 2. rn ri rn a aan 101 
Lautstserkenkontrolle „zus... 76 
Lautstserkeverlauf 3,23 500 28.522 a I 73,. 14 
Liahtpen/L3ohtgun u u.a ara een 60, 105 
EIDKpöinter owner 8 
LISTEN, Systemroutine ......s2cc0ca0n 000 es nennen une 83, 294 
Listings, Steuercodes in - siehe Steuercodes 

EOAD; .Systemroutine 24 ,.uu ar rer 297 
LOAD, BASIC-Befehl .......sccncerececrenen es ee a ee 110 
EORAM GE TE A DE I EEE A FEB EL ul 125, 126 
LOWPASS ....0.00.. ee AR 76 
ManELSSse- sun Des ne 15: f 
Maschinensprache .......-.0s0...2..4J.0.00 000% 20, 49, 51, 61, 62 
MEMBDT ,--Systemroutine 0.2.20, 27 1. 1. en 293 


Mehr farbige Zeichen . 0 0 08 0 0 0 8 0 0 8 8 0 05 oe  o ... ."L.eAete ee se 8 0 ee eo oo 47, 48 


MEMOry' Map. saurer een een . 118 ff 
MEMTLDR,. Systemroutine zransssonnareäaeen enlar aeean 293 
MHhemanie zu... PETER TEN 26 


MOBs - siehe Sprites 
Movable Object Blocks - siehe Sprites 
MPU - siehe CPU 


Multicolor Mode. s..4as u 47 - 49, 51, 57 
NMI-CIA - siehe auch CIA .....oeeeeeuueneennn 41, 89, 98, 99 
NMI=VeKEor wur merci De ee a Br 114 


NOISE, Wellenform - siehe RAUSCH 
NOT - siehe Einserkomplement 


Nybble 20500400 ee u ren ae reware. 1) 
OPEN, "BASIC-Befehl z2..:,,34 5020 0 ee 109 
BPEN:; RSS 232 ee ee ee essen 86 
OPEN, "Systemroutine an. ss en 295 
ODperationscodes/OP-Codes .....2oeoreneneon erneuern nennen 33 
"OR"-Verknuepfung ....cceeeereee Bere ee ee ee 12 
0S/Operatung System - siehe Betriebssystem 

Dszillstoren .,,.3:.3.2% ern eee SERIEN RR > 
DVERLAY une ee ee Re een 111 
Pagdles nee ass nennen 103 
Paritaet :(R5-232) sauna ders PURE TREE RITT 87 
REEK Tuer, RAM unter ROM ur. See 130 
PENOUES- GEL CTA u eat .. 100 
Pinouts..des.'Prozessors Sys a Rh . 131 
P3noues.des: SID „ru nen euere erlete Bl 
PINOUtSs’des: VIE=-TI 1. 22:2 32 era daran 68 
PEDT,. SYyStemLoufine 4.1 arena 299 
P-LOt-Programn «as een 51 
Pointer 7. wur een aan EEE SER ll, 34 
ROFE ser nee ten et PER RER a. 91 


Port Register - siehe Port 
Prioritaet - siehe Sprites, Prioritaet 
PROZBESSOTPOTL au nern. 129,:7285 


Pruefsumme (Tape) ........ NER ea waere 206 
Pulsebreite ........ Dear Searehen enter 12 
PULSE, Wellenform - siehe RECHTECK 

Quote-ModUSs: zu. aa ir ER Eaneeeu 71 
Rahmenfarbe 2... 304 ee EEERET ENT 60, 66 
Raster-Register u... ns een >59, 62 
RAUSCH',  Wellenforn: 5:5... 03 er ren 74, 76 
RDTIM,. Systemroutine sus... ae ern 298 
READST „. Systemröutine sure en 294 
Reals - siehe Fliesskomma 

RECHTECK; Wellenform a. ren 74, 75 
RECOrdErFMOLDrKöäntraol le seiner are 125 
REGISTER Asa anna ai a 11 
Registeruebersieht ELIA. va 4u0u na ran 95 
Registeruebersicht- SID uns a 78 
Registeruebersicht VIC-II .....:...00 a ee ee 6) 
RelaL1VBFOgFamMme una I 108 
RELEASE, 0 Ku 2 ara 73, 74 
Repeat, Tastenwiederholung 40.0000. 8500 2 002... 123 
RESTOR,. SyStenroukine ererrrrnriin ng 291 
RINGMOAULaE 100 ers Er aan 76 
RND - siehe Zufallszahlen 

RS=232-Handl1Nng 2 as er 86 
RS-232=-S5t al usVarlable was a cr u 88 
R5= 232; Belegung des. UWSERPORTS a nun es ana ne 90 
Rundungsstelle „..3,2.2..3 4 RR ED 16 
RUNSTOPY/RESTORE. 22.22.4430 u2205 5], 56, 72, 103, 113, 128 
SAEGEZAHN, Wellenform. sus aaa an 74 
SAVE, BASIE=Berfehl. Aussen een 109 
SAVE, Systemroutine „asien 297 


SAWTOOTH, Wellenform - siehe SAEGEZAHN 


304 


SENKEY,. :Systemroutine- ;2...2..4s92. 302240405275 71, 102, 293 


SCREEN, Systemroutine ........ ET NEUER ... 298 
screen Blanking’ ..7.- = saure ea 60, 64 
Screen Memory - siehe Bildschirmspeicher 

Scrolling zur e en snnein Sea 60 - 62 
SECOND, Systemroutine ......sceccr00. re ee B3,; 292 
Secondary-Address - siehe Sekundaeradresse 

Sekundaeradresse „..v.oeereeoreeereneee ernennen nenne. e . 83 
serial: Data Register sun. 2.2 2 en 92 
serieller Bus .....ooccseueeeenee nee rennen ne 85 ff, 99 
serieller Port zw seen ee 92 
SETLFS, Systentoutine. u.a. ann 295 
SETMSG, Systemroutine ........... ERETEE EL EEOENT 292 
SEINAM; Systemroutine „2... +... HR nn 295 
SETTIM, Systemroutine 242222 543, ua 298 
SETIMO,; :Systenroutine a... 30 Hrn 293 
Shiftregister - siehe Serial Data Register 

SID 222200%% ET UNE ee RN, ee ae 73 ff 


Signalleitungen - siehe Joystick 
Smooth Scrolling - siehe Scrolling 
Softkey - siehe Funktionstasten 
Soft Scrolling - siehe Scrolling 


Speicheraufteilungsuebersicht .......cceererereecee EFTE 117 
Speichergrenze, Festlegung .....sscce 00. east 45, 51 
SPelcherzelle. zu: 334, 2 a a nen 25 - 27, 33 
SPTILEIENETALDOT 4, a nr a rar 70 
SPriLeS unsere ir - 92 ft,:’60 
Sprites;: Abl358 sur ar Da ri een Sa 53, 54 
Sprites, Adresse ......:... er ee ee 43, 54 
Sprites, Aktivierung ...cc.ceeeereeeeeeere ern nne 54 
Sprites, Entwurfsblatt ......ceeeseeerernenee EN .. 69 
Sprites,. Farbe „u. u ran en 53 
Sprites, langsames Erscheinen ..........- ER 944,99 
Sprites, Kollisionen .....vsecceeereeeeenerereeerenenne 47, 58 
Sprites, Multicolor/mehrfarbig .....vc.eeeeeeeereeeeenenen 97 
Sprites, Positionierung .....scceeeeeeereenee ET . 54, 55 
Sprites, Prioritaeten ......scr0200.. PONTE FERNE 47, 54, 57, 58 
Sprites, Vergroesserung .....cvcrerre0e een en U = 36 
SBEUNGYEKLALreNH verneint 20, 124 
Startadresse von BASIC-Programmen ......ceceeereerernen 7.39 
statusvarıable „iur aussen a 14, 106, 294 ff 
StellenVvert. ss 10, 11 
STEUETEDIER . a naar leur ni 23, 24 
SIDP, -5ystemroutine: 34... een 298 
Stoppbit (R5=-232) Sasse sense 86, 87 
Stringfunktion - siehe Funktionen, String- 

SUSTAIN ausweisen een aber 73, 74 
SYACHLONISET LION. er ee din 76 
SYSLEMLaKEFTEQUENZ: 5:5. rn 73, 74 
Systemroutinen .......:.. En EIER TER EN 290 ff 
Taktfrequenz ....vsceere... EEE 59, 290 
TALK, Systenfoutine 1,40: ae ns 83, 294 


Tape-Header - siehe Header 
Tastaturabfrage - siehe Funktionstasten und SCNKEY 


Il TI aueh 113 
TIME OF DAY ....... Meise eereisstendeeen 94, 113 f, 128 
FILMeOUt east a REAL 293 
Timer - siehe CIA, Timer 

IKSA; -Systenroutine „u... were ner 83, 292 
LOKENS. 22, 2205 3 22 2 ER ER NR eher 7,9 
longenerator: 7 zu,3 222 ea erserea en, DT 
TRIANGLE, Wellenform - siehe DREIECK 

Vebertragungsrate (RS-232) ..oooceeeeereeeernenenn nn. 86, 87 
VUebertragungsrate, eigene Spezifizierung (RS-232) ....... 89 
UDTIM, Systemroutine. 2.4.2.3... an 298 
UNESN; Systemnroöutine- ..7.: 24:3 sur 42er 853, 84, 294 


UNterDBrOogTammsprung ar a ae 29 


UNTER, Systemroutine „aus wer Hirn 84, 294 
UPN 2esuı 23er ee 21 
Üserrate. (NS=-232Y ways we aa ren BI 
USR=EFUNKEION nase aan ee ee 20, 114 
VEZU esse ERSTELLE IT ERFTEE :i' 
Variablenablage ..... Dr ae ee nz 17,:-531 
Versrablennane zu 33uu 3.0. are 17 
vYarıablentabelle asus esse 17 
Varzıablentypen ».2u402,8224 2. 2a 17 
VARSUE: zauues ser TREE RR RR NER a Eee ee 17 
VECTOR, Systemroutine ...... RN EEE Re a ee 292 


Vektoren - siehe Sprungvektoren 
Video Matrix - siehe Bildschirmspeicher 


VoLllduplex’ 243,22: 42 133 ER ee u: 87. 
Vordergrund (Funktion) ...seeceerereeee EEE 47, 52, 57 
Vordergründfarbe su. nes. are dia 46, 47 
Wwellenformen. es rs 73 - 75 
Zahlenumwandlung (dezimal und binaer) ......ceeeeeeeeeenne 11 
Zeichenausgaberoutine .....cceeeeeceene FEUERT Iren. RZ 
zeichendefipit1on sau u. en ehren 43 - 46 
Zeichengenerator ......:..:.. PET NE SE ESS 43, 44, 49 
Zeichengenerator, Einblenden .....2.sccereeeeeeereeeenennene 43 
Zeichengenerator, Kopieren .....2s.ceeereeeeeeenenen ne 43, 44 
Zeichendarstellung .z.scs4s32s Le ar 44, 46, 49 
Zerlegung von Adressen - siehe Adresszerlegung 

ZERE0OP308 nun, rain EEE RET 125 
Zufallszahlen: u... 300034008 2. De ren nee 78 
Zusammenhaengen von -BASIC-Pregrammen - siehe Anhaengen ... 
zveierkomplement z..4.u44s2e Henne 14 


306 


Wir bieten Ihnen eine ganze Reihe von weiteren Produkten, 
die Ihnen den Umgang mit Commodore-Computern erleichtern. 


* EXBASIC LEVEL 11 

EXBASIC LEVEL II ist ein Einsteckmodul, das den BASIC- 
Befehlsvorrat Ihres Computers mehr als verdoppelt auf den 
Gebieten Programmierhilfen, Graphik, Farbsteuerung, Ton- 
erzeugung, Mathematik, LEVEL II BASIC-Standard, Schnelle 
Cassettenaufzeichnung, Floppyunterstützung u.v.a.m. Mit 
ausführlichem 120-seitigem Handbuch in deutscher Sprache. 
Gratisinformationen sind bei uns erhältlich. 


* T.EX.AS. "Terminal Extended Assembler" 

'T.EX.AS.' ist ein professionelles Assembler-System mit 
Makro-Assembler, Editor, Re-Assembler, Direkt-Assembler, 
Disassembler, Monitor. Features u.a.: Label-Vearbeitung, 
Makrodefinition mit beliebig vielen Parametern, Full 
Screen Editor (formatfreie Eingabe), dezimale und hexa- 
dezimale Arbeitsweise, Bildschirmfenster-Betrieb, Defi- 
nition von Ablaufsteuerungsfiles, alle Darstellungsmodi: 
Assembly Code - Data - Double Data - Text - ASCII - BSC - 
Dump, komplexe Trace-Möglichkeiten u.v.a.m. Mit zwei 
umfangreichen Handbüchern: Anfängerbuch (setzt keinerlei 
Assemblervorkenntnisse voraus), Programmierhandbuch. 


* COMMODORE BASIC-KURS FÜR BEGINNER, ISBN 3-88623-015-5 
Dieses Buch erklärt ausführlich die BASIC-Programmierung. 
Es ist speziell abgestımmt auf alle Commodore-Computer. 
Vorkenntnisse werden nicht vorausgesetzt. Ein unent- 
behrliches Standardwerk für alle Benutzer von Commodore- 
Geräten. 


* CBM SPIELE-BUCH I MIT 64ER ZUSATZ, ISBN 3-88623-004-X 
Anhand von 18 Spielprogrammen lernen Sie zahlreiche Tips 
und Tricks der Programmierung. BASIC-Vorkenntnisse sind 
zum Verständnis erforderlich. 


* VC-20 SPIELE BUCH I, ISBN 3-88623-014-7 
Wie oben, aber für Commodore VC-20. 


* 6502 ASSEMBLER-KURS FÜR BEGINNER, ISBN 3-88986-000-1 
Von der BASIC- zur Assembler-Programmierung. Vorkennt- 
nisse in Assembler werden nicht vorausgesetzt. Das Buch 
führt leicht verständlich und dennoch umfassend in die 
Assembler-Programmierung der Commodore-Computer ein. Der 


Prozessor 6510 - der im Commodore 64 enthalten ist - wird 
berücksichtigt. Ein Standardwerk der Assembler-Program- 
mierung. 


Wir führen über 1200 Titel und sind damit einer der größten 
Distributoren für Computer-Fachliteratur weltweit. Gerne 
senden wir Ihnen unseren Buch- und/oder Software-Katalog zu. 
INTERFACE AGE Verlagsgesellschaft mbH, Vohburgerstraße 1, D- 
8000 München 2], Tel. (089) 5 80 67 02. 


EXBASIC 
LEVEL I ist 
SOFTMODULE - BBASIC LEVEL II ist erweiterbar mit SOFTMODULEN. . der neue 
Ein SOFTMODUL ist ein Assemblerprogramm, das in den Computer Basic-Standard 
eingeladen wird und den Befehlsvorrat von EXBASIC LEVEL Il er- für Commodore 
weitert. Das bedeutet für Sie, wenn Sie sich einmal EXBASIC Computer. „Extend- 
LEVEL II zugelegt haben, so haben Sie Zugriff zu einer ed Level ll -Basic” stellt 
Auswahl an SOFTMODULEN, die Sie nach Belieben hin- für Ihren Computer ein 
zufügen können. Mit anderen Worten: Sie allein stark erweitertes Level Il- 
bestimmen, wie weit Sie EXBASIC LEVEL II ausbauen Basic - wie es der TRS-80 
wollen, ganz nach Ihren Wünschen. Zwei kennt - zur Verfügung. Mit EX- 
Standard SOFTMODULE werden zu EXBASIC BASIC LEVEL Il haben Sie über 75 
LEVEL II mitgeliefert; sie enthalten die Be- neue, Außerst leistungsfähige Funk- 
fehle SORT/CLEAR u. GOTO X/GOSUB X. tionen für Commodore Computer, die 
In Kürze werden weitere SOFTMODULE das Programmieren wesentlich erleich- 
lieferbar sein. mehrfachgenaue tern und um ein Vielfaches komfortabler 
Arithmetik, erweiterte Graphik, gestalten. Die Implementierung von EBASIC 
Codieren und Decodieren von LEVEL Il erfolgt in freie Sockel des Computers 
Programmen, Matrizenrech- und ist völlig unproblematisch. Mit EXBASIC LEVEL Il 
nungen, Search & Replace erreichen Commodore Computer eine Leistungs- 
und vieles andere mehr. fähigkeit, die bisher als unerreichbar galt. Zudem wer- 
Schaffen Sie sich den Programme für den TRS-80 mit EXBASIC LEVEL II endlich 
schon jetzt die Basis auch auf Commodore lauffähig. Damit steht Ihnen ein riesiges 
für die Zukunft - Softwareangebot für Ihren Computer zur Verfügung. 
mit EXBASIC EXBASIC L II ist bereits weltweit über IO OOOmal verkauft, 
LEVEL II. wollen Sie es sich leisten, auf die neue Standardisierung zu verzichten! 


EXBASIC LEVEL Il bekommen Sie bei Ihrem örtlichen 
Computerfachhändler. 


Das Anleitungsbuch 

Zu EXBASIC LEVEL Il bekommen Sie eine aus- | 
führliche,120 Seiten starke deutsche Anleitung INIERFACE AGE . 
mit Einbauanweisung, Befehlserklärungen, 
LEVEL II Basic Kurs und vielen Beispielen geliefert. 

Im Unterschied zu manch anderer „Anleitung” han- eiyase 
delt es sich hierbei nicht um eine schlecht übersetzte D-8000 ee 91, 
kurze Befehlsbeschreibung, sondem um ein didaktisch Tel. (0 89) 580 67 O2 
aufgebautes und schrittweise an die neuen Möglichkeiten 

von EXBASIC LEVEL II heranführendes Buch, geschrieben vom’ 

Autor der bei COMPUTER LIFE erschienenen Commodore-Buch- 

reihe. 


Der neue Basicsiandard 
für Commodore Computer 


x CBM + VC »VolksComputer + Commodore 64 


Hi ktionen: 

FIND Suchen nach Text, Variablen, mit 
Bereichsangabe. » AUTO automatische 
Zeilennummemgenerierung. » DEL 
Zeilennummembereich löschen. + RE- 
NUM Programmzeilen Umnumerierung. 
« TRACE (OFF) Einzelschritt- oder lang- 
samer Programmablauf mit Einblen- 
dung der jeweils abgearbeiteten Zeile 
(vollständige Zeile). * ON/OFF Ein-/Aus- 
schalten der Repeatfunktion für die Ta- 
sten. Außerdem Fehlermodus: Tritt ein 
Programmfenhler auf, so wird die Zeile 
automafsett(!) gefistet umel der Cursor 
an der fehlerhaften Stelle positioniert. + 
DUMP listet alle normalen Variablen mit 
Inhalten. » MAIRIX listet alle Felgvaria- 
blen (Arrays) mit Inhalten. » LETTER (OFF) 
Umschaltung Grafik-/Großkleinschreib- 
modus. » FAST (OFF) schnelle Bild- 
schirmausgab® bei PRINT-wund LIST. » 

"" Symbol für „zuletzt Dearbeitate 7ei- 
lennummer” (z.B.: \OO GETAS.IFAS — 
"THEN.) + MEM ges Speicherplatzbele- 
gung aus: MAIN MEMORY, PROGRAM. : 
VARIABLES, ARRAYS, STRINGS, REK, FREE. 
«HIMEM Speicherplatzabgrenzung für 
Meschinenptogramme. » SQ Einsprung 
ın Monitor TIM bzw. EXMON. + SPACE 
(OFF) formatiertes tisten. - STOP ON/ 
OFF Die Stoptaste bleibt auch beim 
Ablauf von Maschinenprogrammen ak- 
tiv. « HELP listet alle EXBASIC LEVEL Il Be- 
fehle. + H&LP* listet die Befehle des nor- 
malen Basic. BASIC Ausschalten von 


EXBASIC LEVEL}. + MERGE Zusammenfü- , en mil Paramatenioeroabe. : DOKE 
"m it Par rüberg .® 


gen von Basicprfogrammen fau£h in# 
einander) von Kassette. «- MERGE- wie 
MERGE. aber von Floppy. 
Grafikbefehle: 
PRINT AT,Druck an speaffizierte Bild# 
schirmstelle. - HPLOT horizontales Plot- 
ter. « VPLOT vertikales Plofffen. SET 
Grafikpunkt setzen. » RESET Grofikpunkt 
löschen. » POINT Abfrage. ob Grafik- 
punkt gesetzt oder nicht. 
Mathemalische Funktionen: 

suc s Maximum aus einer Vo- 
nablenliste. - MIN gibt das Minimum 
einer Varkabieniiste aus. - FRACOO 
Nachkommateil einer Zahl. » ROUND(X) 
rundet die Zahl X auf eine ganze Zahl.» 
ROUNDOX.Y) rundet die Zahl X auf Y 
Nochkommastellen. - ODDOXO Abfrage 
ob X gerade oder ungerade ist. 
RNDOXO erzeugt Zufallszahten ohne 
Naoehkommateil zwischen I und X.» 
HEX$OO wandelt die Zahl X in den ent- 
sprechenden hexadezimalen String. 
„m. » DEC(string) wandelt umgekehrt 
Hexstring in die Dezimalzonl. 


LEVEL li Basic: 
ELSE ermöglicht strukturierte IF.THEN..EL- 


SE-Anweisungen, THEN kann bei Ein- 
deutigkeit entfallen. - RESTORE mit Zei- 
lennummernangabe für gezielten DA- 
TA-Zugriff. - ON..RESTORE gesteuertes 
RESTORE, ähnlich ON..GOTO. + PRINT 
USING Ausdruckformatierung für Bild- 
schirm oder Drucker (z.B. für Komma un- 
ter Komma Druck von Zahlen). » REK Er- 
weiterung der Unterprogrammebenen 
für rekursives Programmieren. +» DISPOSE 
NEXT Stackrückstellung für FOR-NEXT- 
Schleifen (.Notausgang” aus einer 
Schleife ohne NEXT). - DISPOSE RETURN 
Wechsel auf eine höhere Unterpro- 
grammebene ohne RETURN-Sprung. » 
DISPOSE CLR®Aussprung aus allen 
Schleifen und Unterprogrammen, 
unabhängig von Schachtelung und 
Tiefe. «JMRUTLINE ermöglicht die Einga- 
be aller Zeichen, also auch Komma, 
Anführungszeichen, Steuerungszei- 
chen, Doppelpunkt ohne Einschränkun- 
gen. bei leerer Eingabe wird Yas Pro- 
gramm nicht abgebrochen, sondem 
die Eingabevariable behält ihren vor- 
herigen Inhalt. - INPUTFORM Eingabe 
von Standardzeichen (keine Cursor- 
steuerung oder RVS, aber Komma, An- 
führungszeichen etc.), sonst wie INPUT- 
LINE. aber es kann eine bestimmte Ein- 
gabelänge spezifiziert werden und an- 
deres. DEF USR= definiert USR-Vektor. » 
DEF CALL= definiert CALL-Vektor. » 
CALL Aufruf vopMaschinenprogram- . 


Doppelbyte-POKE bis 65535. - DEEK : 
Donpelbyte-PEEK. » VARPTR gibt die 
RAM-Adresse an, wo eine bestimmte 
Variable abgespeichert ist. - SPACE 
Druck auf definiertes Bildschirmfetel. - 
STRING$ Beispiel: AS=STRING$ (5.- ”) ist 
gleichbedeutend mit A$="-----". « INSTR 
untersucht ob ein String in einem ande- 
ren enthalten ist. «- EVAL ähnlich VAL, 
aber Bsp.: VAL ("12-49 ist 12, während 
EVAL ("12-4°) den Wert 48 ergibt. EVAL 
verarbeitet alle Funktionen. » EXEC führt 
Basic-Befehle im String aus. « SWAP ver- 
tauscht zwei Variablen ofine Zuhilfe- 
nahme einer dritten. - SEC Programm- 
pause für X Sekunden. » BEEP Tonerzeu- 
gung an C$2. Tohnhöhe und -dauer 
können mit angegeben werden. » ON 
ERROR GOJO ermöglicht die selbstän- 
dige Fortsetzung eines Programmes 
nach Auftreten eines Programmfenlers. 
Zur Fehlerbehandlung stehen die Varia- 
bien EC (error code) und EL (error line) 
zur Verfügung. + RESUME Abschluß einer 


Fehlerbehandlungsroutine, die mit ON 
ERROR GOTO angesprungen wird, mit 
verschiedenen Möglichkeiten. RESUME; 
RESUME NEXT, RESUME Zeilennummier. « 
“«“ Ersatzsymbol für den Befehl REM. » 
HARDCOPY kopiert den Bildschirm auf 
einen Drucker. y : 


FAST TAPE (CBM 2/3/4: VC 20/64) 


Hur dıe genamnten Serien stehen ne- 
ben den normalen Kassettenrekorder- 
befehlen neue zur Verfügung, die mit 
Sfacher Geschwindigkeit arbeiten. Pro- 
grammnamen dürfen bis zu 30 Zei- 
chen (normal 16) lang sein. MOD er- 
zeugt ein Proggamm, das von jedem 
anderen Computer auch ohne EXBA- 
5IC LEVEL Il fünfmal so schnell eingela- 
Jem werden kann und egal wie es ein- 
gelesen wird, automatisch startet. 

DOS SUPPORT (CBM 2/3/4. VC 20/64) 
Das DOS SUPPORT bietet komfortable 
Unterstützung beim Arbeiten mit einer 
Floppystation durch die Verwendung 
von Kurzbefehlen. Mit EXEC sind alle 
POS SUPPORT Funktionen auch pro- 
grammierbar. 


Bildschirnfisond&iuefehie. SCREEN defi- 
niert Bildschirmfenster. + DELLINE löscht 
eine oder mehrere Bildschirmzeilen. + 
INSTLINE schafft Platz für eine oder 
mehrere Bildschirmzeilen. + ENDLINE 
löscht ab Cursorposition bis Zeilenende. 
 BEGINLINE Iöscht vom Zeilenanfang 
bis zur Cursorposition. + SCREEN UP/ 
DOWN Bildschirmrollen nach oben und 
ten » SCREEN » macht den 80- 
ichen-Bildschirm des CBM 8000 
kompatibel zum 40-Zeichen-Schirm 
der anderen Serien 
EXMON (CBM 8): 
Für die Serie 8000 enthält EXBASIC LE- 
VEL Il einen Maschinensprachemonitor, 
der mit GO aufgerufen wıra una foı- 
gende Befehle bietet: A = Assemblie- 


“ ren «+ C = Berechnung eines relativen 


Offsets «+ D — Disassemblieren auf dem 
Bildschirm + G = Ausführung ’eines As- 
semblerprogrammes » L = Laden eines 
Programmes (Kassette oder Diskette) - 
M = Hexdump +» P = Disassemnblieren 
duf &inem Drucker »- S = Abspeichern 
eines Assembierprogrammes 


COLOR SUPPORT (VC 20/64) _ 

mit speziellen Kommanaos zur Farb- 

gestaltung. 

SOUND SUPPORT (VC 20/64 
onderbefehle tür die Ion- und Sound- 

programmierung 


KEY DEFINER (VC 20/64 
ergo endefinitionen 


Der Preis? Er ist - gemessen an den vielfältigen Möglichkeiten, die 
EXBASIC LEVEL Il bietet - so klein, daß wir ihn hier fast vergessen 
hätten: DM 392.- inkl. MwSt. (unverbindliche Verkaufsempfehlung).